2013-05-30 93 views
-1

我寫了使用信號,而不是pthread_cond和pthread_mutex這個小程序:有效使用信號量?

所有的
#include <stdio.h> 
#include <pthread.h> 
#include <semaphore.h> 

sem_t sema; 

pthread_t threads[2]; 

pthread_cond_t cond; 

pthread_mutex_t mutex; 

int value; 

void * worker_a(); 
void * worker_b(); 

int main() { 
    value = 3; 

    sem_init(&sema, 0, 0); 

    pthread_create(&threads[1], NULL, worker_b, NULL); 
    pthread_create(&threads[0], NULL, worker_a, NULL); 

    pthread_join(threads[0], NULL); 
    pthread_join(threads[1], NULL); 

    pthread_detach(threads[0]); 
    pthread_detach(threads[1]); 

    sem_destroy(&sema); 

    printf("Value has been set to: %d.\n", value); 

    return 0; 
} 

/** 
* Multiplicates value by 4. 
*/ 
void * worker_a() { 
    value *= 4; 

    sem_post(&sema); 

    pthread_exit(NULL); 
} 

/** 
* Divides value by 2. 
*/ 
void * worker_b() { 
    sem_wait(&sema); 

    value /= 2; 

    sem_post(&sema); 

    pthread_exit(NULL); 
} 

首先是這個例子正確的嗎?我的意思是它編譯和執行正確,但也許這只是因爲簡單的程序。

作爲第二個:我是否正確理解使用信號量只是使用互斥鎖,條件變量和大量條件標誌的更明智的選擇?

博德

+0

關於第二個問題參見[百科](http://en.wikipedia.org/wiki/Semaphore_(編程)#Semaphores_vs._mutexes) –

+0

我無法確定你的解決方案的「正確性」,因爲我不知道你在計算什麼!如果您的目標是創建互斥,您可能需要考慮使用[拆分二進制信號量(PDF警告)](http://www.cs.arizona.edu/classes/cs422/spring08/notes/4-Chapter4.pdf )。一般來說,大多數鎖系統實際上都是通過信號量來實現的。 –

+0

@RyanMarcus的目標是將價值設置爲6作爲最終結果。這個工程,但我不知道這個解決方案是否真的安全 – bodokaiser

回答

1

不,這是不正確的,因爲你在評論明確的目標(有value最終成爲6)。無法保證worker_aworker_b的執行順序。

您使用信號量與使用普通互斥量沒有區別。它僅保護value免受併發處理,但而不是強制執行任何排序。在抓取信號量之前將sleep(5)扔到worker_a之前,你會明白我的意思。

您可能將信號量初始化爲,並在完成後發送worker_a。然後worker_b將喚醒在正確的時間做的工作:

// main 
// ---- 
    sem_init(&sema, 0, 0); // N.B. initial value is ZERO 

// worker_a 
// -------- 
    value *= 4;    // We know a priori that sema is zero and others will wait for it 
    sem_post(&sema);  // Let worker_b proceed 

// worker_b 
// -------- 
    sem_wait(&sema);  // Pause until worker_a is done 
    value /= 2; 
    sem_post(&sema); 
+0

你完全正確。我改變了線程初始化的順序,然後結果是四個而不是六個。我怎麼能解決這個問題?發佈信號量似乎不起作用 – bodokaiser

+0

@bodokaiser,查看代碼示意圖的更新答案 – pilcrow