2015-05-26 31 views
0

我剛開始學習線程和信號量。 我已經在C中創建了一個簡單的程序,但它沒有按預期工作。 請看代碼並告訴我我錯在哪裏?信號量不正常?

在此先感謝。

我使用的是Ubuntu 14.04。

命令我使用

的gcc -o富th.c -lpthread

./foo

th.c是我的C文件的名稱

在執行每次程序應該輸出:

Thread 1

Thre ad 2

你好!

但我得到大部分的時間

線程2

線程1

代碼:

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

void myFun1(void *ptr); 
void myFun2(void *ptr); 

char buf[24]; 
sem_t mutex; 

int main(){ 

    pthread_t t1; 
    pthread_t t2; 

    char *msg1 = "Thread 1"; 
    char *msg2 = "Thread 2"; 

    sem_init(&mutex, 0, 1); 

    printf("mutex 00 %d \n", mutex);  
    pthread_create(&t1, NULL, (void *) &myFun1, (void *) msg1); 
    pthread_create(&t2, NULL, (void *) &myFun2, (void *) msg2); 

    pthread_join(t1, NULL); 
    pthread_join(t2, NULL); 

    sem_destroy(&mutex); 

    return 0; 
} 

void myFun1 (void *ptr) { 

    char *msg = (char *)ptr; 
    printf("%s\n", msg); 

    sem_wait(&mutex); 
    sprintf(buf, "%s", "Hello Threads!"); 
    sem_post(&mutex); 

    pthread_exit(0); 
} 

void myFun2(void *ptr) { 

    char *msg = (char *)ptr; 
    printf("%s\n", msg); 

    sem_wait(&mutex); 
    printf("%s\n", buf); 
    sem_post(&mutex); 

    pthread_exit(0); 
} 
+0

你期望什麼?我怎麼能說,爲什麼它不按照你期望的方式工作,如果你不告訴你的期望? – gnasher729

+0

@ gnesher729 - 對不起,我忘了更新,現在我已經更新了這個問題。 –

回答

1

你的期望是錯誤的。您的程序不包括任何同步,以使t1線程在t2線程之前執行(反之亦然),因此可以排序。

t2首先獲取信號量的情況下,buf仍然是一個空字符串,這就是打印的內容。

你需要的是爲t2等待,直到t1填充緩衝區。您可以通過將信號量初始化爲0來完成此操作,並且只有在寫入buf之後才發佈信號量。在main()

sem_init(&mutex, 0, 0); 

myFun1

void myFun1 (void *ptr) { 

    char *msg = (char *)ptr; 
    printf("%s\n", msg); 

    sprintf(buf, "%s", "Hello Threads!"); 
    sem_post(&mutex); 

    pthread_exit(0); 
} 

myFun2

void myFun2(void *ptr) { 

    char *msg = (char *)ptr; 
    printf("%s\n", msg); 

    sem_wait(&mutex); 
    printf("%s\n", buf); 

    pthread_exit(0); 
} 

現在t2只會嘗試打印buf它已被初始化後,無論t2t1先跑步。

+0

非常感謝您的澄清。現在工作正常。 –