一般来说,在多线程竞争一个资源的时候,会用到pthread_cond_wait,pthread_cond_signal机制,典型的做法就是在一个使用这个资源的线程(消费者)里面,判断资源如果不可用的话,则pthread_cond_wait,在另外一个线程(生产者)中判断如果资源可用的话,则发一个pthread_cond_signal或者pthread_cond_broadcast通知wait的线程。
但是有一个问题,就是在wait成功后,实际上此时的资源是否就一定可用呢?答案是否定的,如果存在两个线程同时使用这个资源的话,wait返回后,有可能资源已经被使用了。所以在这种情况下,判断资源是否可用,应该用如下模型:
while (resource==TRUE)
{
pthread_cond_wait( &COND, &MUTEX);
}
这里用了while,而不是用if,原因就是上面提到的。当然,如果在应用中,只有一个消费者,就可以直接用if了。
要搞清楚这个问题背后的问题,就需要知道pthread_cond_wait的实际过程。
当发起一个pthread_cond_wait之后,分解后,实际上是三个动作:
1、解锁
2、等待
当收到一个解除等待的信号(pthread_cond_signal或者pthread_cond_broad_cast)之后,pthread_cond_wait马上需要做的动作是:
3、上锁
了解这个原理后,假设出现如下场景:如果消费者A的wait在收到解除信号后,去上锁,但是这个时候,被消费者B先上锁,把资源使用掉了,然后解锁,然后消费者A上锁成功,wait返回,而此时资源已经不可用了,所以消费者A必须在判断一下资源的可用性。
分享到:
相关推荐
以下是对pthread_cond_wait的用法进行了详细的分析介绍,需要的朋友可以过来参考下
信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait信号pthread_cond_wait
为什么在pthread_cond_wait()前要加一个while循环来判断条件是否为假呢?.zip
一篇博客内容 pthread_cond_wait详解
Linux多线程之条件阻塞代码 包含mutex 与pthread_cond_wait,pthread_cond_signal的应用 详细内容见readme.txt
pthread_testcancel pthread_kill pthread_cancel 的使用例子
多线程编程:条件变量使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...
我只想要进程的某个线程休眠一段时间的,可是用sleep()是将整个进程都休眠的,这个可能达不到,我们想要的效果... 采用pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t *mutex, const struct timesp
编译时报 Looking for pthread_create - not found 的解决办法 linux gcc 编译时报Looking for pthread_create - not found 其解决办法是...
libpthread.so.0 pthread_cond_wait recv connect pthread_create send accept pthread_cond_signal pthread_cond_init pthread_mutex_unlock pthread_mutex_lock pthread_mutex_init _Jv_RegisterClasses close ...
线程编程——使用pthread_join。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可...
线程中处理信号pthread_sigmask 的使用
本人主要想练习一下socket c++ 多...现在遇到的问题是,不知道咋回事,主线程 pthread_cond_signal (&cond) 发送的条件 似乎 新的线程 pthread_cond_wait (&cond, &mutex) 没有收到,不知是不是发生传说中的死锁???
主要介绍pthread_cread() 的介绍,便于自己学习和回顾。 如有错误欢迎指出。
pthread资源包,pthread源码和已经...pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&newThread, &attr, Function_t, NULL);
线程编程——不使用pthread_join。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”...
pthread_cond_wait内部会解锁,然后等待条件变量被其它线程激活 3。pthread_cond_wait被激活后会再自动加锁 激活线程: 1。加锁(和等待线程用同一个锁) 2。pthread_cond_signal发送信号 3。解锁
2.2多线程介绍如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能),那么继续提高CPU性能的方法就是超线程CPU模式 2.2.1多线程出现的原因