条件变量与互斥锁演示程序挂起
Condition Variable with Mutex lock demonstration program hangs
创意:
当线程A需要检查条件变量x
的状态时,它将首先持有互斥锁,然后检查变量的状态,如果发现无效,它将开始等待。
然后线程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对锁和条件变量
问题已被发现。
发出信号后,我需要退出循环。但在此之前,我还需要解锁互斥锁。functionOfThreadB
中增加的代码在下面的程序中用******突出显示。
#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";
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;
while (1)
{
pthread_mutex_lock (&mutexLock);
if (x == 1000)
{
std :: cout << "nA: x is now 1000. Waiting period over."<< "n";
return 0;
}
else
{
std :: cout << "nNow, thread A will wait for value of `x` to reach 1000" << "n";
pthread_cond_wait (&cond, &mutexLock);
}
pthread_mutex_unlock (&mutexLock);
}
}
void * functionOfThreadB (void * ptr)
{
while (1)
{
char * message;
message = (char *) ptr;
pthread_mutex_lock (&mutexLock);
x = x + 1;
if (x == 1000)
{
std :: cout << "nB: Signaled. Value of x: " << x << "n";
pthread_cond_signal (&cond);
*************pthread_mutex_unlock (&mutexLock);*************
*************return 0;*************
}
else
{
std :: cout << "nB: Not signaled yet. Value of x: " << x << "n";
}
pthread_mutex_unlock (&mutexLock);
}
}
相关文章:
- 设置变量时C++程序挂起
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 有时ShowWindow从不调用OnShowWindow,主应用程序挂起
- 访问类成员的成员变量时 cpp 程序挂起
- 为什么线程分离时程序挂起
- 多线程程序挂起条件等待
- 调试Win32应用程序挂起
- 为什么我的多线程应用程序挂起
- 调用 Fortran 函数会使程序挂起
- 使用应用程序验证程序调试时应用程序挂起
- C++文件 I/O - 程序挂起
- MFC应用程序挂起在发出终止信号的线程中
- cvCaptureFromCAM导致程序挂起
- 在QImage上渲染QWebElement时,QT应用程序挂起
- 分段错误会导致程序挂起吗
- C++程序挂起在Visual Studio v.6中
- 通过析构函数删除动态成员会导致程序挂起
- 找出应用程序挂起的位置
- Qt程序挂起(不响应),直到函数结束,然后再次开始工作
- 条件变量与互斥锁演示程序挂起