Tag: 条件变量

虚假唤醒后的互斥状态

考虑使用pthreads这个基本的multithreading程序。 我们有一个主线程,创建另一个做一些工作的线程。 bool done = false; mutex m; condition c; void foo() { pthread_mutex_lock(&m); //while(!done) { pthread_cond_wait(&c, &m); // Spuriously wakeup while child is doing work. // child thread has NOT unlocked the mutex yet // Do I now own the mutex? // or am I waiting for child to unlock it? //} pthread_mutex_unlock(&m); } […]

使用pthread_cond_wait和pthread_cond_signal保证屈服

假设我有一个带有3个POSIX线程的C程序,共享一个全局变量,互斥量和条件变量,其中两个执行以下伪代码: …process data… pthread_mutex_lock( &mutex ); variable = data_ptr; pthread_cond_signal( &cond ); pthread_mutex_unlock( &mutex ); 第三次运行: while(1) { while( variable == NULL ) { pthread_mutex_wait( &cond, &mutex ); } printf( “Data is %d”, *variable ); } 假设第三个线程将看到前两个中的每一个的数据是否安全? 换句话说,如果一个线程在互斥锁和一个条件变量上作用,是否可以安全地假设它是下一个获取锁定的信号,而不是一个其他可能正在等待的线程。锁?

C – 保证condvars已准备好发信号

我有一个简单的应用程序,可以与不同的硬件接口。 对于每个硬件,我针对一个独特的监视器函数生成一个pthread_t ,共有6个线程:1个管理器线程和5个工作线程。 每个线程都有一个通用的初始化例程,它等待管理器线程通过以下方式唤醒它: pthread_mutex_lock(&mMutex); pthread_cond_wait(&mMutex, &condVar); pthread_mutex_lock(&mMutex); 然后主线程通过一次发出一个信号来唤醒所有线程: pthread_cond_wait(&mMutex1, &condVar1); pthread_cond_wait(&mMutex2, &condVar2); … pthread_cond_wait(&mMutex5, &condVar5); 代码实际上工作正常,但这是因为我对时机很幸运。 当主/管理器线程发出pthread_cond_signal ,存在远程但存在的机会,即线程尚未完成初始化。 我需要找到一种方法来保证每个条件变量都有相应的工作线程对它进行了wait调用。 我总是可以创建一个在相应的互斥锁中设置的状态布尔值,但据我所知,我无法在一条指令中primefaces地执行set和wait操作。 我也可以使用pthread_barrier_t ,但这只是保证所有线程在进行各自的wait调用之前都是一个或两个指令。 是否有一种可靠的方法来确定已经进行了wait调用,或者我是否需要采用某种定时等待循环/检查方法? 谢谢。

如何使用条件变量

Linux编程接口书有一段代码(生产者/消费者)来展示条件变量的工作原理: static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; static int avail = 0; while (TRUE) { s = pthread_mutex_lock(&mtx); while (avail == 0) { /* Wait for something to consume */ s = pthread_cond_wait(&cond, &mtx); } while (avail > 0) { /* Consume all available units */ avail–; } s = pthread_mutex_unlock(&mtx); […]