线程的互斥锁和条件变量通信机制

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <time.h>
  4 #include <pthread.h>
  5
  6 #define BUFFER_SIZE 2
  7 struct prodcons
  8 {
  9     int buffer[BUFFER_SIZE];
 10     pthread_mutex_t lock;
 11     int readpos,writepos;
 12     pthread_cond_t notempty;
 13     pthread_cond_t notfull;
 14 };
 15
 16 void init(struct prodcons *prod)
 17 {
 18     pthread_mutex_init(&prod->lock,NULL);
 19     pthread_cond_init(&prod->notempty,NULL);
 20     pthread_cond_init(&prod->notfull,NULL);
 21     prod->readpos=0;
 22     prod->writepos=0;
 23 }
 24
 25 void put(struct prodcons *prod, int data)
 26 {
 27     pthread_mutex_lock(&prod->lock);
 28     while((prod->writepos+1)%BUFFER_SIZE==prod->readpos)
 29     {
 30         printf("producer wait for not full\n");
 31         pthread_cond_wait(&prod->notfull,&prod->lock);
 32     }
 33     prod->buffer[prod->writepos]=data;
 34     prod->writepos++;
 35     if(prod->writepos>=BUFFER_SIZE)
 36         prod->writepos=0;
 37     pthread_cond_signal(&prod->notempty);
 38     pthread_mutex_unlock(&prod->lock);
 39 }
 40
 41 int get(struct prodcons *prod)
 42 {
 43     int data;
 44     pthread_mutex_lock(&prod->lock);
 45     while(prod->writepos==prod->readpos)
 46     {
 47         printf("consumer wait for not empty\n");
 48         pthread_cond_wait(&prod->notempty,&prod->lock);
 49     }
 50     data=prod->buffer[prod->readpos];
 51     prod->readpos++;
 52     if(prod->readpos>=BUFFER_SIZE)
 53         prod->readpos=0;
 54     pthread_cond_signal(&prod->notfull);
 55     pthread_mutex_unlock(&prod->lock);
 56     return data;
 57 }
 58
 59 #define OVER (-1)
 60
 61 struct prodcons buffer;
 62
 63 void *producer(void * data)
 64 {
 65     int n;
 66     for(n=1;n<=5;n++)
 67     {
 68         printf("producer sleep 1 second...\n");
 69         sleep(1);
 70         printf("put the %d product\n",n);
 71         put(&buffer,n);
 72     }
 73     for(n=6;n<=10;n++)
 74     {
 75         printf("producer sleep 3 second...\n");
 76         sleep(3);
 77         printf("put the %d product\n",n);
 78         put(&buffer,n);
 79     }
 80     put(&buffer,OVER);
 81     printf("producer stopped\n");
 82     return NULL;
 83 }
 84
 85 void *consumer(void *data)
 86 {
 87     int d=0;
 88     while(1)
 89     {
 90         printf("consumer sleep 2 second...\n");
 91         sleep(2);
 92         d=get(&buffer);
 93         printf("get the %d product\n",d);
 94         if(d==OVER)
 95             break;
 96     }
 97     printf("consumer stopped\n");
 98     return NULL;
 99 }
100
101 int main(int argc, char *argv[])
102 {
103     pthread_t th_a,th_b;
104     void *retval;
105     init(&buffer);
106     pthread_create(&th_a,NULL,producer,0);
107     pthread_create(&th_b,NULL,consumer,0);
108     pthread_join(th_a,&retval);
109     pthread_join(th_b,&retval);
110     return 0;
111 }

线程的互斥锁和条件变量通信机制

时间: 2024-10-14 17:12:33

线程的互斥锁和条件变量通信机制的相关文章

linux 线程的同步 二 (互斥锁和条件变量)

互斥锁和条件变量 为了允许在线程或进程之间共享数据,同步时必须的,互斥锁和条件变量是同步的基本组成部分. 1.互斥锁 互斥锁是用来保护临界区资源,实际上保护的是临界区中被操纵的数据,互斥锁通常用于保护由多个线程或多进程分享的共享数据.一般是一些可供线程间使用的全局变量,来达到线程同步的目的,即保证任何时刻只有一个线程或进程在执行其中的代码.一般加锁的轮廓如下: pthread_mutex_lock() 临界区 pthread_mutex_unlock() 互斥锁API pthread_mutex

多线程之互斥锁、条件变量

多线程 一个进程在同一时刻只能做一件事,而多个线程却可以同时执行,每个线程处理各自独立的任务.多线程有很多好处: 简化处理异步事件的代码 实现内存和文件描述符的共享 改善程序的吞吐量 改善响应时间 互斥锁 互斥锁:互斥锁通过锁机制来实现线程间的同步,在同一时刻通常只允许一个关键部分的代码 当多个线程控制相同的内存时,对于读写操作的时间差距就有可能会导致数据的不同步,下图就很清晰的说明了这种情况: 对于线程A.B此时对同一块内存进行操作,但是由于操作几乎是同时进行的,假设当线程A读入数据i之后,在

Linux互斥锁、条件变量和信号量

Linux互斥锁.条件变量和信号量  来自http://kongweile.iteye.com/blog/1155490 博客分类: Linux sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享.sem_wait:一直阻塞等待直到信号量>0.sem_timedwait:阻塞等待若干时间直到信号量>0.sem_post:使信号量加1.sem_destroy:释放信号量.和sem_init对应. 进行多线程编程,最应该注意的就是那些共享的数据

UNIX网络编程:互斥锁和条件变量

在网络编程中,一般都是多线程的编程,这就出现了一个问题:数据的同步与共享.而互斥锁和条件变量就是为了允许在线程或进程间共享数据.同步的两种最基本的组成部分.它们总能够用来同步一个进程中的多个线程. 再进入互斥锁和条件变量之前,我们先对多线程的一些相关函数进行简单介绍: 多线程简单介绍和相关函数: 通常,一个进程中包括多个线程,每个线程都是CPU进行调度的基本单位,多线程可以说是在共享内存空间中并发地多道执行程序,与进程相比,线程的具有以下优点: ● 减少系统调度开销.由于线程基本不拥有资源,因此

互斥锁和条件变量(pthread)相关函数

互斥锁 #include <pthread.h> // 若成功返回0,出错返回正的Exxx值 // mptr通常被初始化为PTHREAD_MUTEX_INITIALIZER int pthread_mutex_lock(pthread_mutex_t *mptr); int pthread_mutex_trylock(pthread_mutex_t *mptr); // pthread_mutex_lock 函数的非阻塞模式 int pthread_mutex_unlock(pthread_m

生产者-消费者问题:介绍POSIX线程的互斥量和条件变量的使用

全局初始化互斥量和条件变量(不全局也行,但至少要对线程启动函数可见,这样才能使用.) static pthread_cont_t cond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 使用互斥量锁住一块代码方法如下(默认忽略pthread开头的函数的错误检查,即类似 int s = pthread_xxx(...); if (s != 0) { printErrorMsg(

互斥锁和条件变量的结合使用

互斥锁一个明显的缺点是他只有两种状态:锁定和非锁定.而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,他常和互斥锁一起使用.使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化.一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程.这些线程将重新锁定互斥锁并重新测试条件是否满足.一般说来,条件变量被用来进行线承间的同步. 对于条件锁,通常配合一个互斥锁一起使用,以防止多个线程同时请求pt

Linux 线程同步的三种方法(互斥锁、条件变量、信号量)

互斥锁 1 #include <cstdio> 2 3 #include <cstdlib> 4 5 #include <unistd.h> 6 7 #include <pthread.h> 8 9 #include "iostream" 10 11 using namespace std; 12 13 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 14 15 int tmp; 16

【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)

上篇文章也蛮好,线程同步之条件变量与互斥锁的结合: http://www.cnblogs.com/charlesblc/p/6143397.html 现在有这篇文章: http://blog.csdn.net/goodluckwhh/article/details/8564319 POSIX定义了一系列同步对象用于同步和互斥.同步对象是内存中的变量属于进程中的资源,可以按照与访问数据完全相同的方式对其进行访问.默认情况下POSIX定义的这些同步对象具有进程可见性,即同步对象只对定义它的进程可见: