問題: 我必須增加x1和x2變量,這應該由單獨的線程完成,並且兩個變量的下一個增量不應該被調用,直到兩個變量的前一個增量未完成爲止。在這個解決方案中信號量的使用是正確的嗎?
建議的解決方案: 初始化4旗語並調用單獨的線程變量的單獨的增量。 2個信號量用於將消息傳遞給啓動遞增的線程,以及2個用於將消息傳遞給主線程的信號量,以實現遞增完成。主線程將等待來自兩個子線程的信號量發佈,顯示兩個變量的增量都已完成,然後主線程將消息傳遞給兩個子線程,以允許進一步遞增。
這一個目前正在對我罰款。但是,一個人能提出更好的解決方案嗎?或者,任何人都可以指出這個解決方案的問題? 任何幫助將不勝感激?提前致謝。
解決方案代碼:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
//Threads
pthread_t pth1,pth2;
//Values to calculate
int x1 = 0, x2 = 0;
sem_t c1,c2,c3,c4;
void *threadfunc1(void *parm)
{
for (;;) {
x1++;
sem_post(&c1);
sem_wait(&c3);
}
return NULL ;
}
void *threadfunc2(void *parm)
{
for (;;) {
x2++;
sem_post(&c2);
sem_wait(&c4);
}
return NULL ;
}
int main() {
sem_init(&c1, 0, 0);
sem_init(&c2, 0, 0);
sem_init(&c3, 0, 0);
sem_init(&c4, 0, 0);
pthread_create(&pth1, NULL, threadfunc1, "foo");
pthread_create(&pth2, NULL, threadfunc2, "foo");
sem_wait(&c1);
sem_wait(&c2);
sem_post(&c3);
sem_post(&c4);
int loop = 0;
while (loop < 8) {
// iterated as a step
loop++;
printf("Initial : x1 = %d, x2 = %d\n", x1, x2);
sem_wait(&c1);
sem_wait(&c2);
printf("Final : x1 = %d, x2 = %d\n", x1, x2);
sem_post(&c3);
sem_post(&c4);
}
sem_wait(&c1);
sem_wait(&c2);
sem_destroy(&c1);
sem_destroy(&c2);
sem_destroy(&c3);
sem_destroy(&c4);
printf("Result : x1 = %d, x2 = %d\n", x1, x2);
pthread_cancel(pth1);
pthread_cancel(pth2);
return 1;
}
唯一的問題,我可以找出,sem_post和sem_wait是耗時.. –
我假設這是一個sanitized的例子,真正的程序不僅僅是增加計數器?特別的,線程的唯一目的是讓你一次做兩件事。有意將它們鎖定在這種鎖步形式中會破壞它們的整個目的。 –
是的,大圖中,x2可能依賴於x1,需要最後的x1值在特定的步驟求解計算。它是一種求解器,在每次迭代中執行step解決方案@CortAmmon –