[Linux线程]线程的同步--使用条件变量完成线程同步-创新互联

#include 
#include 
#define BUFFER_SIZE 4
#define OVER (-1)
struct producers                                        //定义生产者条件变量结构。
{
        int buffer[BUFFER_SIZE];                        //定义缓冲区。
        pthread_mutex_t lock;                           //定义访问缓冲区的互斥锁。
        int             readpos, writepos;                      //读写的位置。
        pthread_cond_t  notempty;                       //缓冲区有数据时的标记。
        pthread_cond_t  notfull;                        //缓冲区未满的标记。
};
//初始化缓冲区
void init(struct producers *b)
{
        pthread_mutex_init(&b->lock,NULL);
        pthread_cond_init(&b->notempty,NULL);
        pthread_cond_init(&b->notfull,NULL);
        b->readpos=0;
        b->writepos=0;
}
//在缓冲区中存放一个整数。
void put(struct producers *b, int data)
{
        pthread_mutex_lock(&b->lock);
        //当缓冲区为满时等待。
        while((b->writepos+1)%BUFFER_SIZE == b->readpos)
        {
          pthread_cond_wait(&b->notfull,&b->lock);
          //在返回之前,pthread_cond_wait需要参数b->lock。
        }
        //向缓冲区中写数据,并将写指针向前移动。
        b->buffer[b->writepos] = data;
        b->writepos++;
        if(b->writepos >= BUFFER_SIZE)
        {
         b->writepos=0;
        }
        //发送当前缓冲区中有数据的信号。
        pthread_cond_signal(&b->notempty);
        pthread_mutex_unlock(&b->lock);
}
//从缓冲区中读数据并将数据从缓冲区中移走。
int get(struct producers *b)
{
        int data;
        pthread_mutex_lock(&b->lock);
        //当缓冲区中有数据时等待。
        while(b->writepos == b->readpos)
        {
           pthread_cond_wait(&b->notempty,&b->lock);
        }
       //从缓冲区中读数据,并将指针前移。
       data = b->buffer[b->readpos];
       b->readpos++;
       if(b->readpos >= BUFFER_SIZE)
       {
         b->readpos = 0;
       }
       //发送当前缓冲区未满的信号。
       pthread_cond_signal(&b->notfull);
       pthread_mutex_unlock(&b->lock);
       return data;
}
struct producers  buffer;
//这是生产者的线程处理函数
void *producer(void *data)
{
    int n;
    for(n=0;n<10;n++)
    {
      printf("生产者: %d-->\n",n);  //连续10次生产
      put(&buffer,n);
    }
    put(&buffer,OVER);         //将状态放入buffer中
    return NULL;
}
//这是消费者的线程处理函数
void *consumer(void *data)
{
    int d;
    while(1)
    {
      d = get(&buffer);  //从buffer中读取对应的状态
      if(d == OVER)      //如果已经没有了则停止
      {
       break;
      }
      printf("消费者: --> %d\n",d);
    }
    return NULL;
}
//这是主程序
int main(int argc,char *argv[])
{
    pthread_t thproducer,thconsumer;    //生产者和消费者的id
    void *retval;
    init(&buffer);    //初始化缓冲区
    pthread_create(&thproducer,NULL,producer,0); 
    pthread_create(&thconsumer,NULL,consumer,0);  //创建两个线程
    pthread_join(thproducer,&retval);
    pthread_join(thconsumer,&retval);    //阻塞进程
    return 0;
}

在城步等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站建设、网站设计 网站设计制作按需定制网站,公司网站建设,企业网站建设,品牌网站设计,成都全网营销推广,成都外贸网站建设,城步网站建设费用合理。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站栏目:[Linux线程]线程的同步--使用条件变量完成线程同步-创新互联
本文网址:http://ybzwz.com/article/jopsi.html