C++ Pthread查询:线程顺序错误 #包括 #包括 int num_线程=3; int state=0; pthread_cond_t cond; pthread_mutex_t mutex; void*threadA(void*args){ int i; 对于注释中提到的@mch(i=0;i
),您需要等待线程完成,然后才能允许C++ Pthread查询:线程顺序错误 #包括 #包括 int num_线程=3; int state=0; pthread_cond_t cond; pthread_mutex_t mutex; void*threadA(void*args){ int i; 对于注释中提到的@mch(i=0;i,c++,c,pthreads,C++,C,Pthreads,),您需要等待线程完成,然后才能允许main()函数返回: #include<pthread.h> #include<stdio.h> int num_threads=3; int state=0; pthread_cond_t cond; pthread_mutex_t mutex; void* threadA(void* args) { int i; for(i=0; i<5; i++){ pthread_mutex_lock(&m
main()
函数返回:
#include<pthread.h>
#include<stdio.h>
int num_threads=3;
int state=0;
pthread_cond_t cond;
pthread_mutex_t mutex;
void* threadA(void* args) {
int i;
for(i=0; i<5; i++){
pthread_mutex_lock(&mutex);
while(state == 1 || state == 2) pthread_cond_wait(&cond,&mutex);
printf("Thread A\n");
state = (state+1)%num_threads;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
}
void* threadB(void* args) {
int i;
for(i=0; i<5; i++){
pthread_mutex_lock(&mutex);
while(state == 0 || state == 2)pthread_cond_wait(&cond,&mutex);
printf("Thread B\n");
state = (state+1)%num_threads;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
}
void* threadC(void* args) {
int i;
for(i=0; i<5; i++){
pthread_mutex_lock(&mutex);
while(state == 1 || state == 0) pthread_cond_wait(&cond,&mutex);
printf("Thread C\n\n");
state = (state+1)%num_threads;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
}
int main() {
pthread_t tid[3];
pthread_cond_init(&cond,NULL);
pthread_mutex_init(&mutex,NULL);
pthread_create(&tid[0],NULL,threadA,NULL);
pthread_create(&tid[1],NULL,threadB,NULL);
pthread_create(&tid[2],NULL,threadC,NULL);
return 0;
现在,在您将上面的联接添加到main()
的末尾后,您的程序通常会挂起。这是因为pthread\u cond\u signal()
不会唤醒等待该条件变量的所有线程。如果唤醒了错误的线程(例如,threadC发出条件信号,但收到通知的线程不是threadA),则所有线程都将等待该条件,并且没有人发出该条件的信号
要解决此问题,您需要确保每次都唤醒所有线程,并让每个线程决定是否轮到它自己(通过
while(state…)pthread_cond_wait(…);
)。为此,您可以将对pthread_cond_signal()
的调用替换为对pthread_cond_broadcast()的调用
,它将取消阻止当前在该条件下被阻止的所有线程。您的main
函数在线程完成之前结束。您应该pthread\u join
在线程上…或者通过调用pthread\u exit()离开main()
@lonut感谢您提出的解决方案。@Abhishek:注意,pthread\u cond\u broadcast()
应该是您的默认值-pthread\u cond\u signal()
是一种优化(如果您的程序正确,那么如果您用pthread\u cond\u broadcast()替换每个pthread\u cond\u signal()
,它仍然是正确的)
)。
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);
pthread_join(tid[2], NULL);