Why does pthread_cond_signal not work?【转】
转自:http://stackoverflow.com/questions/16819169/why-does-pthread-cond-signal-not-work#
|
I am currently learing all around POSIX threads (pthread). I now have created a simple program which increased a shared value by 7 until above 10000 then it should signal a condition to the next thread which decreases it by 3 until under 1000. At last it should divide the result through 2 and main should output the result. |
my code
pthread_t threads[];
pthread_cond_t cond_a, cond_b;
pthread_mutex_t mutex; int counter; void * worker_one();
void * worker_two();
void * worker_three(); int main(int argv, const char ** argc) {
counter = ; pthread_cond_init(&cond_a, NULL);
pthread_cond_init(&cond_b, NULL);
pthread_mutex_init(&mutex, NULL); pthread_create(&threads[], NULL, worker_one, NULL);
pthread_create(&threads[], NULL, worker_two, NULL);
pthread_create(&threads[], NULL, worker_three, NULL); pthread_join(threads[], NULL);
pthread_join(threads[], NULL);
pthread_join(threads[], NULL); printf("Value started at %d and ends with %d.\n", , counter); return ;
} void * worker_one() {
printf("Worker one started.\n"); pthread_mutex_lock(&mutex); printf("Worker one starting work.\n");
while (counter < ) {
counter += ;
} pthread_cond_signal(&cond_a); printf("Worker one finished work with: %d.\n", counter); pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
} void * worker_two() {
printf("Worker two started.\n"); pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond_a, &mutex); printf("Worker two starting work.\n");
while (counter > )
counter -= ; printf("Worker two finished work with: %d.\n", counter); pthread_cond_signal(&cond_b);
pthread_mutex_unlock(&mutex); sleep(); pthread_exit(NULL);
} void * worker_three() {
printf("Worker three started.\n"); pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond_b, &mutex); printf("Worker three starting work.\n"); counter /= ; printf("Worker three finished work with: %d.\n", counter); pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
For some reason the whole execution hangs around the first thread. The signal is also fired but thread two does not react.
Can somebody tell me what I am doing wrong?
|
|
Could somebody tell me why down vote? – bodokaiser May 29 '13 at 16:23
|
||
|
|
I've moved the code from gist to SO. Don't just link to code on an external site, please include relevant code in the question. – user7116 May 29 '13 at 16:25
|
||
|
|
ok did not knew anything about this – bodokaiser May 29 '13 at 16:25
|
6 down vote accepted
|
I have answered a similar question here: pthread condition variables on Linux, odd behaviour. The problem is that you wait before even testing the condition you want to wait for is true. What happens is that thread 1 signals before thread 2 is waiting, therefore the signal is lost and thread 2 will be waiting forever. In order to avoid this, first test what you want to wait for, then wait only if it's not here. EDIT: Ok, here is a possible solution with only one mutex and one condtion (untested) Thread 1: |
pthread_mutex_lock(&mutex);
while(thread_1_should_work == false){ // wait until the condition is satisfied
pthread_cond_wait(&cond, &mutex);
} //at this point, we owe the mutex and we know thread_1_should_work is true; // do work thread_1_shoudl_work = false;
thread_2_should_work = true; pthread_cond_broadcast(&cond); //wake up any waiting thread (if it's not their turn, they'll call wait again)
pthread_mutex_unlock(&mutex);
|
@bodokaiser: you'll have to make up a variable, but a simple boolean flag will do. Spurious wakeups are a reality unfortunately. – user7116 May 29 '13 at 16:35
|
|
|
@sixlettervariables so the main idea of conditions are just some more specific mutex signaling (with out the actual locking). Is this correct? – bodokaiser May 29 '13 at 16:36
|
|
|
Yes, in your case is thread_is_working flag would work (except that it has more than 6 letters :) I think the answer that the linked answer can help. – Ben May 29 '13 at 16:38
|
|
|
Actually, wait() releases the mutex and yield the thread atomically so that nothing happens while the thread is being yield. – Ben May 29 '13 at 16:41
|
Why does pthread_cond_signal not work?【转】的更多相关文章
- pthread_cond_signal惊群现象
1.如下代码所示: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include < ...
- 关于 pthread_cond_wait 和 pthread_cond_signal , signal 无效的问题
关于一个消费者模式,,,引起的问题.. 我在io线程里不断的把一个函数调用放到队列里 然后ruby线程就不断的从这个队列里取出函数之争并运行. 典型的 消费者模式. 我曾经以为是这样... 这是wor ...
- 深入理解pthread_cond_wait、pthread_cond_signal
===============================man pthread_cond_wait的解释========================== LINUX环境下多线程编程肯定会遇到 ...
- 条件变脸pthread_cond_signal丢失问题
直接上代码: static bsem_t bsem; void* t1(void *arg) { /*printf("enter task 1\n");*/ /*while(1)* ...
- pthread_cond_wait和pthread_cond_signal以及互斥变量的使用情况
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h& ...
- pthread_cond_signal该放在什么地方?
pthread_cond_signal()的具体位置? "pthread_cond_signal()必须要放在pthread_mutex_lock() 和pthread_mutex_unlo ...
- 线程相关函数(6)-pthread_cond_wait(),pthread_cond_signal(), 条件变量
pthread_cond_tpthread_cond_initpthread_cond_destroypthread_cond_waitpthread_cond_timedwaitpthread_co ...
- 条件变量pthread_cond_wait()和pthread_cond_signal()详解
条件变量 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立" ...
- 【转】pthread_cond_signal 虚假唤醒问题
引用:http://blog.csdn.net/leeds1993/article/details/52738845 什么是虚假唤醒? 举个例子,我们现在有一个生产者-消费者队列和三个线程. I.1号 ...
随机推荐
- java web(三) Tomcat虚拟目录映射方式
Tomact服务器虚拟目录的映射方式 web应用开发好后若想被外界访问,需要将web应用所在的目录交给web服务器管理,这个过程称为虚拟目录的映射. 方式一:在server.xml文件的host元素中 ...
- jq图片点击居中放大原始图片兼容ie
/* *鍥剧墖澶у浘鏄剧ず */ function imgshow(){ content_div:"";//内容 bg_div:"";//背景变暗 img_di ...
- IEnumerable和IQueryable区别、优缺点
转自 http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html IEnumerable接口 公开枚举器,该枚举器支持在指定类型 ...
- oracle initialization or shutdown in progress问题解决步骤
今天像往常一样打开电脑,启动plsql工具连接数据库,但是尽然连接不了,报了“oracle initialization or shutdown in progress”的提示信息,从操作系统 ...
- 自动删除Mysql备份(数组+for)
#!/bin/bash #author:V #Dispaly:auto delete mysql backup. BACKDIR=(/home/11/mysqlbackup/ /home/full/) ...
- # 20145334 《Java程序设计》第9周学习总结
20145334 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC 1.Java语言访问数据库的一种规范,是一套API. 2.JDBC (Java Da ...
- C++8002011752鸡兔同笼
难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外) ...
- jquery send(data) 对data的处理
// Convert data if not already a string if ( s.data && s.processData && typeof s.dat ...
- Empire C:游戏篇(1)
随机生成1-6的数字,我们来猜是几 猜小了就提示数字小了,请再猜 猜大了就提示数字大了,请再猜 猜对了就提示恭喜,并提示是否继续再玩 ///riddle ///Author:JA //2015-1-2 ...
- 【iCore3 双核心板】例程三十二:UART_IAP_ARM实验——更新升级STM32
实验指导书及代码包下载: http://pan.baidu.com/s/1hrnLJwC iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...