想法:
当线程A需要检查条件变量x
的状态时,它会先持有互斥锁,然后检查变量的状态,如果发现无效,则开始等待。
线程 B 不会中断,因为线程 A 当前具有互斥锁。一旦线程 A 等待,它就会释放互斥量。
线程 B 然后可以获取互斥锁并为所欲为。
#include <stdlib.h>
#include <pthread.h>
#include <iostream>
pthread_mutex_t mutexLock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void * functionOfThreadA (void * ptr);
void * functionOfThreadB (void * ptr);
int x = 0;
int main ()
{
pthread_t threadA;
pthread_t threadB;
char *messageA = (char *) "Thread A"; // TODO
char *messageB = (char *) "Thread B";
int returnValueA;
int returnValueB;
returnValueA = pthread_create (&threadA, NULL, functionOfThreadA, (void*) messageA);
returnValueB = pthread_create (&threadB, NULL, functionOfThreadB, (void*) messageB);
pthread_join (threadA, NULL);
pthread_join (threadB, NULL);
exit (0);
}
void * functionOfThreadA (void * ptr)
{
char * message;
message = (char *) ptr;
std :: cout << "\nA: " << message << "\n";
while (1)
{
pthread_mutex_lock (&mutexLock);
if (x == 10)
{
std :: cout << "\nx == 10 : true, functionOfThread A: " << message << "\n";
}
else
{
std :: cout << "\nThread waits." << "\n";
pthread_cond_wait (&cond, &mutexLock);
std :: cout << "\nA:++ " << message << "\n";
}
pthread_mutex_unlock (&mutexLock);
return 0;
}
}
void * functionOfThreadB (void * ptr)
{
while (1)
{
char * message;
message = (char *) ptr;
pthread_mutex_lock (&mutexLock);
x = x + 1;
if (x == 10)
{
std :: cout << "\nfunctionOfThread B: " << message << "\n";
pthread_cond_signal (&cond);
}
else
{
std :: cout << "\nB: Not signaled yet. Value of x: " << x << "\n";
}
pthread_mutex_unlock (&mutexLock);
return 0;
}
}
输出:
anisha@linux-trra:~> ./a.out
B: Not signaled yet. Value of x: 1
A: Thread A
Thread waits.
^C
然后它就会挂起。
我需要在这里更正什么以及为什么?
最佳答案
线程在这里 pthread_cond_wait (&cond, &mutexLock);
无限期地等待,因为没有其他线程向它发出信号。线程 B 对锁和条件变量什么都不做
关于c++ - 带互斥锁的条件变量演示程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14314961/