Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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);