2013-04-12 27 views
1

我有一個創建pthread的主函數。我試圖用信號量在選定的時間打印一個全局變量(注意:互斥體,S1,S2,以及memoryUsed所有全局聲明):如何阻止pthread從main打印全局變量,然後繼續pthread?

int main(int argc, const char * argv[]) 
{ 
    pthread_mutex_init(&mutex, NULL); 
    sem_init(&s1, 0, 0); 
    sem_init(&s2, 0, 0); 

    pthread_t t0; 
    pthread_create(&t0, NULL, &matrix_management, NULL); 

    sem_wait(&s1); // wait for signal from pthread 
    printf("Memory Usage from main: %d bytes\n\n", memoryUsed); // global var 
    sem_post(&s2); // signal pthread to continue 

    pthread_join(t0, NULL); 
    sem_destroy(&s1); 
    sem_destroy(&s2); 
    pthread_mutex_destroy(&mutex); 
    return 0; 
} 

在我的目標函數,我想停止在選定的點並從main打印一個全局變量。請注意,目標函數中的變量已更改。有一次,我打印,我想繼續目標函數:

void *matrix_management(void *len) 
{ 
    pthread_mutex_lock(&mutex); 

    // CHANGE GLOBAL VAR 
    memoryUsed = 1; 

    sem_post(&s1); // print from main 
    sem_wait(&s2); // wait for signal 

    // continue thread... 


    pthread_mutex_unlock(&mutex); 
    return NULL; 
} 

然而,主線程似乎並沒有在所有的信號等待從並行線程。它立即打印其全局變量的值。如果我在pthread中註釋掉信號,程序不會死鎖。你能像這樣在MAIN線程和pthread之間使用信號量嗎?

回答

0

根據您的平臺,可能不支持未命名的信號量。以下情況適用於這種情況,儘管您可能需要創建臨時名稱並稍後將其用於取消鏈接。我熟悉這一點的唯一原因是因爲我通常使用的平臺OS X不支持通過10.8.3的未命名信號量,因此無法檢測到我與您的代碼看到的類似行爲,因爲所有信號量API失敗。

希望它有幫助。

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

sem_t* s1=NULL, *s2=NULL; 
int memoryUsed = 0; 

void *matrix_management(void *len) 
{ 
    // CHANGE GLOBAL VAR 
    memoryUsed = 1; 

    sem_post(s1); // print from main 
    sem_wait(s2); // wait for signal 
    printf("Thread woken up.\n"); 

    // continue thread... 
    return NULL; 
} 

int main(int argc, const char * argv[]) 
{ 
    s1 = sem_open("s1", O_CREAT, S_IRUSR | S_IWUSR, 0); 
    s2 = sem_open("s2", O_CREAT, S_IRUSR | S_IWUSR, 0); 
    assert(s1 && s2 && "Failed to allocate semaphores."); 

    pthread_t t0; 
    pthread_create(&t0, NULL, &matrix_management, NULL); 

    sem_wait(s1); // wait for signal from pthread 
    printf("Memory Usage from main: %d bytes.\n", memoryUsed); // global var 

    printf("Waking thread...\n"); // global var 
    sem_post(s2); // signal pthread to continue 

    pthread_join(t0, NULL); 
    printf("Thread finished\n"); 
    sem_close(s1); 
    sem_close(s2); 
    sem_unlink("s1"); 
    sem_unlink("s2"); 
    return 0; 
} 

輸出

Memory Usage from main: 1 bytes. 
Waking thread... 
Thread woken up. 
Thread finished 
+0

這確實是問題。不知道關於OS X.謝謝你的幫助! – whblackburn