0

問題の説明

以下のコードでは、スレッドを使用して x1 と x2 の値を順番に計算しようとしています。プロセッサにとってコストがかかります。問題は、両方のスレッドを並行して実行したいのですが、両方のスレッドのループを均等にシリアル化する必要があります (つまり、1 回の呼び出しで 1 回実行する必要があります)。したがって、これらの while ループを削除して結果をシリアルに取得する方法はありますか。x1 と x2 は互いに独立しているため、セマフォとミューテックスの使用について非常に混乱していますか? 助けてください。前もって感謝します。

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

pthread_t pth1,pth2;
//Values to calculate
int x1 = 0, x2 = 0;
//Values for condition
int cond1 = 0,cond2 = 0;


void *threadfunc1(void *parm)
{
    for (;;) {
        // Is this while loop is very costly for the processor?
        while(!cond1) {}
        x1++;
        cond1 = 0;
    }
    return NULL ;
}
void *threadfunc2(void *parm)
{
    for (;;) {
        // Is this while loop is very costly for the processor?
        while(!cond2) {}
        x2++;
        cond2 = 0;
    }
    return NULL ;
}



int main () {
    pthread_create(&pth1, NULL, threadfunc1, "foo");
    pthread_create(&pth2, NULL, threadfunc2, "foo");
    int loop = 0;
    while (loop < 10) {
        // iterated as a step
        loop++;
        printf("Initial : x1 = %d, x2 = %d\n", x1, x2);
        cond1 = 1;
        cond2 = 1;
        // Is this while loop is very costly for the processor?
        while(cond1) {}
        while(cond2) {}
        printf("Final   : x1 = %d, x2 = %d\n", x1, x2);
    }

    pthread_cancel(pth1);
    pthread_cancel(pth2);
    return 1;
}
4

1 に答える 1