3线程同步:条件变量

1条件变量

条件变量给多个线程提供了一个汇合的场所。

依赖的头文件

#include<pthread.h>

函数声明

定义分配条件变量

pthread_cond_t cond =PTHREAD_COND_INITIALIZER;

 

int pthread_cond_init(pthread_cond_t*restrict cond, const pthread_condattr_t *restrict attr);

名称:

pthread_cond_init

功能:

initialize condition variables  初始化条件变量

头文件:

#include <pthread.h>

函数原形:

int pthread_cond_init(pthread_cond_t *restrict
cond,

             const pthread_condattr_t *restrict attr);

参数:

 

返回值:

the pthread_cond_destroy() and pthread_cond_init() functions shall return zero; otherwise, an error number shall be returned to indicate
the error

 

int pthread_cond_destroy(pthread_cond_t*cond);

名称:

pthread_cond_destroy

功能:

Destroy condition variables  销毁条件变量

头文件:

#include <pthread.h>

函数原形:

int pthread_cond_destroy(pthread_cond_t *cond);

参数:

 

函数说明:

在释放或废弃条件变量之前,需要毁坏它,使用此函数

返回值:

the pthread_cond_destroy() and pthread_cond_init() functions shall return zero; otherwise, an error number shall be returned to indicate
the error

 

int pthread_cond_wait(pthread_cond_t*restrict cond,pthread_mutex_t *restrict mutex);

名称:

pthread_cond_wait

功能:

Wait on a condition,等待某个条件是否成立。对于timewait()函数除了等待以外,可以设置一个时长。

头文件:

#include <pthread.h>

函数原形:

intpthread_cond_wait(pthread_cond_t
*restrict cond,pthread_mutex_t *restrict mutex);

参数:

 

函数说明:

一旦初始化了互斥对象和条件变量,就可以等待这个条件,一个特定条件只能有一个互斥对象,而且条件变量应该表示互斥数据“内部”的一种特殊的条件更改。一个互斥条件可以用许多条件变量(例如:cond_empty,cond_full,cond_cleanup),但每个条件变量只能有一个互斥对象。

返回值:

 

 

int pthread_cond_signal(pthread_cond_t*cond);

名称:

pthread_cond_signal

功能:

signal a condition,这种情况是只有一个线程收到后执行动作。

头文件:

#include <pthread.h>

函数原形:

int pthread_cond_signal(pthread_cond_t *cond);

参数:

 

函数说明:

活动线程只需要唤醒第一个正在睡眠的线程。假设您只对队列添加了一个工作作业。那么只需要唤醒一个工作程序线程(再唤醒其它线程是不礼貌的!)

返回值:

 

 

int pthread_cond_broadcast(pthread_cond_t*cond);

名称:

pthread_cond_broadcast

功能:

broadcast a condition,通过广播的形式发给子线程消息,子线程竞争执行。

头文件:

#include <pthread.h>

函数原形:

int pthread_cond_broadcast(pthread_cond_t *cond);

参数:

 

函数说明:

如果线程更改某些共享数据,而且它想要唤醒所有正在等待的线程,则应使用 pthread_cond_broadcast调用

返回值:

 

案例说明:

#include <stdlib.h>

#include <pthread.h>

#include <stdio.h>

#include <unistd.h>

 

struct msg {

   struct msg *next;

   int num;

};

 

struct msg *head;

/*条件变量 */

pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void *consumer(void *p)

{

   struct msg *mp;

   for (;;) {

       pthread_mutex_lock(&lock);

       /* pthread_cond_wait(&has_product, &lock);

        * 1.阻塞等待has_product被唤醒,

        * 2.释放互斥锁, pthread_mutex_unlock(&lock)

        * 3.当被唤醒时,解除阻塞,并且重新去申请获得互斥锁
pthread_mutex_lock(&lock)

        */

       while (head == NULL)

           pthread_cond_wait(&has_product, &lock);

 

       mp = head;

       head = mp->next;

       pthread_mutex_unlock(&lock);

       printf("Consume %d\n", mp->num);

       free(mp);

       sleep(rand() % 5);

   }

}

 

void *producer(void *p)

{

   struct msg *mp;

   for (;;) {

       mp = (struct msg *)malloc(sizeof(struct msg));

       mp->num = rand() % 1000 + 1;

       printf("Produce %d\n", mp->num);

       pthread_mutex_lock(&lock);

       mp->next = head;

       head = mp;

       pthread_mutex_unlock(&lock);

       /* pthread_cond_broadcast(&has_product)唤醒等待队列上的所有线程*/

                  //发送信号,告诉消费者有产品了

       pthread_cond_signal(&has_product);

       sleep(rand() % 5);

   }

}

 

int main(int argc, char *argv[])

{

   pthread_t pid, cid;

   srand(time(NULL));

   pthread_create(&pid, NULL, producer, NULL);

   pthread_create(&cid, NULL, consumer, NULL);

   pthread_join(pid, NULL);

   pthread_join(cid, NULL);

   return 0;

}

运行结果:

总结:从上面可以看出,消费者总是消费最先生产出来的一个。

时间: 2025-01-29 10:26:14

3线程同步:条件变量的相关文章

并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对原生态的POSIX 的mutex,cond的生成者,消费者的实现,我们可以再次体会boost带给我们的便利. 1. 什么是互斥量        互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁.对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将

UNIX环境高级编程:线程同步之互斥锁、读写锁和条件变量

一.使用互斥锁 1.初始化互斥量 pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//静态初始化互斥量 int pthread_mutex_init(pthread_mutex_t*mutex,pthread_mutexattr_t*attr);//动态初始化互斥量 int pthread_mutex_destory(pthread_mutex_t*mutex);//撤销互斥量 不能拷贝互斥量变量,但可以拷贝指向互斥量的指针,这样就可以使多个函数

UNIX环境高级编程:线程同步之条件变量及属性

条件变量变量也是出自POSIX线程标准,另一种线程同步机制.主要用来等待某个条件的发生.可以用来同步同一进程中的各个线程.当然如果一个条件变量存放在多个进程共享的某个内存区中,那么还可以通过条件变量来进行进程间的同步. 每个条件变量总是和一个互斥量相关联,条件本身是由互斥量保护的,线程在改变条件状态之间必须要锁住互斥量.条件变量相对于互斥量最大的优点在于允许线程以无竞争的方式等待条件的发生.当一个线程获得互斥锁后,发现自己需要等待某个条件变为真,如果是这样,该线程就可以等待在某个条件上,这样就不

Linux线程同步之条件变量

条件变量是线程可用的另一种同步机制.条件变量给多个线程提供了一个会合的场所.条件本身是由互斥量保护的.线程在改变 条件状态前必须首先锁住互斥量. 条件变量的初始化 pthread_cond_init 去除初始化 pthread_cond_destroy 等待 pthread_cond_wait 满足条件给向进程发送信号 pthread_cond_signal 下面程序展示了利用条件变量等待另外两个线程满足条件时,第三个进程继续向前执行 #include <stdio.h> #include &

二、(LINUX 线程同步) 互斥量、条件变量以及生产者消费者问题

原创转载请注明出处: 接上一篇: 一.(LINUX 线程同步) 引入  http://blog.itpub.net/7728585/viewspace-2137980/ 在线程同步中我们经常会使用到mutex互斥量,其作用用于保护一块临界区,避免多线程并发操作对这片临界区带来的数据混乱, POSIX的互斥量是一种建议锁,因为如果不使用互斥量也可以访问共享数据,但是可能是不安全的. 其原语包含: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

同步-互斥量 临界区 信号量 条件变量 效率对比

问题描述 互斥量 临界区 信号量 条件变量 效率对比 windows 下,如下四种同步方式中,互斥量 临界区 信号量 条件变量, 效率对比,求指导,谢谢 解决方案 据我自己在windows下的测试,信号量比条件变量高效,大概是其6倍 解决方案二: 条件变量效率应该最高,但是可能不是那么线程安全 临界区效率第二好 解决方案三: 临界区(Critical Section)(同一个进程内,实现互斥) 保证在某一时刻只有一个线程能访问数据的简便办法.在任意时刻只允许一个线程对共享资源进行访问.如果有多个

练习生产者与消费者-PYTHON多线程中的条件变量同步-Queue

以前练习过,但好久不用,手生,概念也生了, 重温一下.. URL: http://www.cnblogs.com/holbrook/tag/%E5%A4%9A%E7%BA%BF%E7%A8%8B/ ~~~~~~~ 互斥锁是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法.线程首先acquire一个条件变量,然后判断一些条件

Linux线程管理必备:解析互斥量与条件变量的详解_C 语言

   做过稍微大一点项目的人都知道,力求程序的稳定性和调度的方便,使用了大量的线程,几乎每个模块都有一个专门的线程处理函数.而互斥量与条件变量在线程管理中必不可少,任务间的调度几乎都是由互斥量与条件变量控制.互斥量的实现与进程中的信号量(无名信号量)是类似的,当然,信号量也可以用于线程,区别在于初始化的时候,其本质都是P/V操作.编译时,记得加上-lpthread或-lrt哦.    有关进程间通信(消息队列)见:进程间通信之深入消息队列的详解 一.互斥量 1. 初始化与销毁:    对于静态分

基本线程同步(四)在同步代码中使用条件

在同步代码中使用条件 在并发编程中的一个经典问题是生产者与消费者问题,我们有一个数据缓冲区,一个或多个数据的生产者在缓冲区存储数据,而一个或多个数据的消费者,把数据从缓冲区取出. 由于缓冲区是一个共享的数据结构,我们必须采用同步机制,比如synchronized关键字来控制对它的访问.但是我们有更多的限制因素,如果缓冲区是满的,生产者不能存储数据,如果缓冲区是空的,消费者不能取出数据. 对于这些类型的情况,Java在Object对象中提供wait(),notify(),和notifyAll()