【发布时间】:2017-03-10 15:17:03
【问题描述】:
我想从主线程向等待条件的所有其他线程发送广播信号。在我看来,广播信号在线程中来得早。
#include <iostream>
#include <pthread.h>
#define NUM 4
#define SIZE 256
using namespace std;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_barrier_t barrier;
class cache{
int lv1;
public:
int write(int i){
lv1=i;
pthread_cond_broadcast(&cond);
}
};
cache c[NUM];
void *thread(void *arg){
int i = (int)arg;
for(;;){
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond,&mutex);
cout << "Thread: "<< i << endl;
//do some work
pthread_mutex_unlock(&mutex);
}
}
int main()
{
pthread_t tid[NUM];
pthread_barrier_init(&barrier,NULL,NUM+1);
for(int i=0;i<NUM;i++){
pthread_create(&tid[i],NULL,thread,(void*)i);
}
//Sleep(2);
c[0].write(55); //broadcast signal
//Sleep(2);
c[1].write(44); //broadcast signal
for(int i=0;i<NUM;i++){
pthread_join(tid[i],NULL);
}
cout << "Hello world!" << endl;
return 0;
}
如果我在主函数中插入 Sleep(2),它可以工作,但我不想在调用 pthread_broadcast 之前等待时间而是同步。 我想到了一个障碍,但是 pthread_cond_wait 是阻塞的,对吧?
【问题讨论】:
-
请注意:为什么不使用标准的
-library? -
感谢注解,以后我会看看标准的
库 -
@TomNeumeier 如果您使用的是 ubuntu,请安装 glibc-doc pkg 并仔细阅读 pthread_cond_signal/broadcast 的手册页。通常,您在锁定下修改谓词,然后广播或向等待线程发出信号。请注意,pthread_cond_wait 可能会被虚假唤醒,因此您需要重新检查持有 mutex 的谓词(您在 wakepu 上自动获取 mtx)。
标签: c++ synchronization pthreads