当前位置: 技术问答>linux和unix
关于条件变量的使用
来源: 互联网 发布时间:2016-05-20
本文导语: 条件变量是为我们所熟悉的。 linux中也提供了对条件变量的使用:pthread_cond_wait,pthread_cond_timedwait,pthread_cond_signal,pthread_cond_broadcast。 它们与sleep,wakeup的区别是什么呢? | pthread_cond_wait,pthread_cond_time...
条件变量是为我们所熟悉的。
linux中也提供了对条件变量的使用:pthread_cond_wait,pthread_cond_timedwait,pthread_cond_signal,pthread_cond_broadcast。
它们与sleep,wakeup的区别是什么呢?
linux中也提供了对条件变量的使用:pthread_cond_wait,pthread_cond_timedwait,pthread_cond_signal,pthread_cond_broadcast。
它们与sleep,wakeup的区别是什么呢?
|
pthread_cond_wait,pthread_cond_timedwait,pthread_cond_signal,pthread_cond_broadcast主要用于进程中的线程同步,是用户空间不同线程的同步机制,以防止对criticl资源的不正确访问,对于不同的系统,起实现方式也不同,有的实现可能不需要内核的参与,下面是这几个函数的含义,具体可以参看:http://blog.csdn.net/gogofly_lee/archive/2008/04/15/2293465.aspx
# pthread_cond_wait()会阻塞调用的线程,直到特定的条件(condition)满足,当这个线程运行时,mutex会被 加锁,当它阻塞时mutex会自动解锁。当收到信号唤醒线程时,mutex会被线程自动上锁, 当线程完成更新共享数据后,开发者有责任解锁mutex。
# pthread_cond_signal()用来通知(唤醒)等待在条件变量上的另一线程,在mutex 被加锁后被调用,在完成pthread_cond_wait()运行后必须解锁mutex。
# 如果多于一个线程处于阻塞状态,应该用pthread_cond_broadcast()代替pthread_cond_signal()。
# 如果在调用pthread_cond_wait()前先调用pthread_cond_signal()就是逻辑错误
sleep,wakeup主要用于内核,当然在用户空间也有相应的函数,主要用于相应的进程由于各种原因主动释放CPU等各种系统资源。对于手持设备来说,用户空间的sleep,wakeup函数更侧重于实施系统的电源管理。
# pthread_cond_wait()会阻塞调用的线程,直到特定的条件(condition)满足,当这个线程运行时,mutex会被 加锁,当它阻塞时mutex会自动解锁。当收到信号唤醒线程时,mutex会被线程自动上锁, 当线程完成更新共享数据后,开发者有责任解锁mutex。
# pthread_cond_signal()用来通知(唤醒)等待在条件变量上的另一线程,在mutex 被加锁后被调用,在完成pthread_cond_wait()运行后必须解锁mutex。
# 如果多于一个线程处于阻塞状态,应该用pthread_cond_broadcast()代替pthread_cond_signal()。
# 如果在调用pthread_cond_wait()前先调用pthread_cond_signal()就是逻辑错误
sleep,wakeup主要用于内核,当然在用户空间也有相应的函数,主要用于相应的进程由于各种原因主动释放CPU等各种系统资源。对于手持设备来说,用户空间的sleep,wakeup函数更侧重于实施系统的电源管理。
|
从用户空间来说,
pthread_cond_wait,pthread_cond_timedwait 就是用来sleep的一种机制,
而对应的 pthread_cond_signal,pthread_cond_broadcast是用来wake up的一种机制。
我说在内核空间有类似的东西。但是用户空间的和内核空间的这两类事物确实不是同一类东西。
要不就是我没说清,要不就是你没说清,呵呵。
pthread_cond_wait,pthread_cond_timedwait 就是用来sleep的一种机制,
而对应的 pthread_cond_signal,pthread_cond_broadcast是用来wake up的一种机制。
我说在内核空间有类似的东西。但是用户空间的和内核空间的这两类事物确实不是同一类东西。
要不就是我没说清,要不就是你没说清,呵呵。
|
楼主很懒,问问题的态度还比较差!
|
不懂,帮顶
|