2011-02-16 184 views
0

实际上,主要的场景是:从主线程有两个线程正在运行。通过使用条件变量,两个线程将运行并休眠,然后它将返回到主线程。我的意思是我不想要不同的输出模式。只有一种模式:从main-> thread1-> thread2-> main。 我已经写了对C thread.It代码显示我有时候有时候想not.as例如,输出的是结果:一个线程如何在另一个线程中被杀死

I am in thread 1 
before conditional wait 
I am in thread 2 
before conditional release 
i am again in thread 2 
i am again in thread 1 
main exits here 

的问题是有时“这里主要退出”不execute.Please帮助me.It要注意的是,我不能使用在pthread_join()。我的代码如下

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <semaphore.h> 

pthread_mutex_t gLock; 
pthread_cond_t gCondition; 

pthread_mutex_t mLock; 
pthread_cond_t mCondition; 

void initialize() 
{ 
     pthread_mutex_init(&gLock, NULL); 
     pthread_cond_init (&gCondition, NULL); 
     pthread_mutex_init(&mLock, NULL); 
     pthread_cond_init (&mCondition, NULL); 

     return; 
} 

void * threadOne(void * msg) 
{ 
    printf("%s \n",(char*) msg); 
    printf("before conditional wait\n"); 

    pthread_mutex_lock(&gLock); 
    pthread_cond_wait(&gCondition,&gLock); 
    pthread_mutex_unlock(&gLock); 

    printf("i am again in thread 1\n"); 

    pthread_mutex_lock(&mLock); 
    pthread_cond_signal(&mCondition); 
    pthread_mutex_unlock(&mLock); 

} 

void * threadTwo(void * msg) 
{ 
    printf("%s\n",(char*)msg); 
    printf("before conditional release\n"); 
    pthread_mutex_lock(&gLock); 
    pthread_cond_signal(&gCondition); 
    pthread_mutex_unlock(&gLock); 
    printf("i am again in thread 2\n"); 

} 

int main() 
{ 
     pthread_t thread1; 
     pthread_t thread2; 

     char * msg1="I am in thread 1"; 
     char * msg2="I am in thread 2"; 
     initialize(); 

     pthread_create(&thread1,NULL,threadOne,(void*) msg1); 
     pthread_create(&thread2,NULL,threadTwo,(void*) msg2); 

     pthread_mutex_lock(&mLock); 
     pthread_cond_wait(&mCondition,&mLock); 
     pthread_mutex_unlock(&mLock); 

     printf("main exits here"); 

     return 0; 
} 
+0

为什么不能使用pthread_join?这是父线程等待孩子完成的常用方式。 – paxdiablo 2011-02-16 08:45:57

回答

0

给出的问题是,你不正确使用的条件变量。条件变量只是一个通知机制,而不是一个标志。除了当前正在等待的线程列表之外,它没有内部状态。因此,如果main()在其他线程调用pthread_cond_signal()时没有实际执行远达pthread_cond_wait()的调用,那么信号将丢失,并且main()将永远等待。

您需要使用与条件变量关联的单独标志。然后main()可以检查这个标志,并且只有等待标志没有被设置。此外,它必须在循环中检查该标志,以确保处理“虚假唤醒”,其中pthread_cond_wait()返回而不是对应的信号。 threadOnethreadTwo之间的通知同样适用。

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <semaphore.h> 

pthread_mutex_t gLock; 
pthread_cond_t gCondition; 
int gFlag=0; 

pthread_mutex_t mLock; 
pthread_cond_t mCondition; 
int mFlag=0; 

void initialize() 
{ 
    pthread_mutex_init(&gLock, NULL); 
    pthread_cond_init (&gCondition, NULL); 
    pthread_mutex_init(&mLock, NULL); 
    pthread_cond_init (&mCondition, NULL); 
} 

void * threadOne(void * msg) 
{ 
    printf("%s \n",(char*) msg); 
    printf("before conditional wait\n"); 

    pthread_mutex_lock(&gLock); 
    while(!gFlag) 
    { 
     pthread_cond_wait(&gCondition,&gLock); 
    } 
    pthread_mutex_unlock(&gLock); 

    printf("i am again in thread 1\n"); 

    pthread_mutex_lock(&mLock); 
    mFlag=1; 
    pthread_cond_signal(&mCondition); 
    pthread_mutex_unlock(&mLock); 

} 

void * threadTwo(void * msg) 
{ 
    printf("%s\n",(char*)msg); 
    printf("before conditional release\n"); 
    pthread_mutex_lock(&gLock); 
    gFlag=1; 
    pthread_cond_signal(&gCondition); 
    pthread_mutex_unlock(&gLock); 
    printf("i am again in thread 2\n"); 

} 

int main() 
{ 
    pthread_t thread1; 
    pthread_t thread2; 

    char * msg1="I am in thread 1"; 
    char * msg2="I am in thread 2"; 
    initialize(); 

    pthread_create(&thread1,NULL,threadOne,(void*) msg1); 
    pthread_create(&thread2,NULL,threadTwo,(void*) msg2); 

    pthread_mutex_lock(&mLock); 
    while(!mFlag) 
    { 
     pthread_cond_wait(&mCondition,&mLock); 
    } 
    pthread_mutex_unlock(&mLock); 

    printf("main exits here"); 

    return 0; 
}