2013-10-07 41 views
0

我是pthread編程的新手。我正在寫一個示例代碼,我想在pthread_cond_signal()中傳遞變量,如下所示:如何在pthread_cond_signal函數中傳遞變量?

pthread_t th1,th2; 
pthread_cond_t con1 = PTHREAD_COND_INITIALIZER; 
pthread_cond_t con2 = PTHREAD_COND_INITIALIZER; 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

void* fun(void *gh) 
{ 
    pthread_mutex_lock(&mutex); 
    flag=1; 
    pthread_cond_wait(&con1,&mutex); 
    printf("This is test\n"); 
    pthread_mutex_unlock(&mutex); 
} 

int main() 
{ 
    char *s; 
    int a; 
    s=malloc(sizeof(char)*4); 
    printf("Enter thread Number \n"); 
    scanf("%d",&a); 
    sprintf(s,"con%d",a); 
    pthread_create(&th1,NULL,fun,NULL); 
    sleep(1); 
    while(flag==0) //wait until pthread_cond_wait is called 
    {} 
    pthread_mutex_lock(&mutex); 
    pthread_cond_signal((pthread_cond_t *)s); 
    pthread_mutex_unlock(&mutex); 
    pthread_join(th1,NULL); 
    pthread_join(th2,NULL); 
    return 0; 
} 
+0

此外,你的while(flag == 0)循環可能永遠不會結束。您需要鎖定每次訪問標誌的位置,否則代碼可能永遠不會讀取標誌,因爲它可能會加載到寄存器中,或者可能會在程序中優化。 –

回答

1

您正在使用線程。程序的所有線程都相互共享內存。問題不是從其他線程讀取變量。問題是以正確的順序讀取它們:沒有更新,過時或未來。

解決這個問題是互斥信號和條件的全部原因。

你想要做的是不通過pthread_cond_signal傳遞一個值。你所做的就是把這個值設置到兩個線程都可以讀取的內存中,然後發送信號。

我不得不想知道爲什麼您認爲pthread_cond_signal((pthread_cond_t *)s)會起作用? s不是,也從來不是一個條件。 A pthread_cond_t不是您傳遞的值。這是POSIX線程庫用來跟蹤條件狀態的結構。