0

threadsを変更する2 つを使用するときに発生する問題を再現したいと思いglobal variable: soldeます。はをfirst thread増分しsolde、 はsecond減分します。

ソースコードを使用すると、より明確になります。

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

int solde = 250;

void *threadFunc(void *arg)
{
    if (strcmp(arg, "credit") == 0)
    {
        // increment critical ressource
        printf("[credit-start] solde = %d\n", solde);
        solde = solde + 10000;
        printf("[credit-end] solde = %d\n", solde);
    } else {
        // decrement critical ressource
        printf("[debit-start] solde = %d\n", solde);
        solde = solde - 30;
        printf("[debit-end] solde = %d\n", solde);
    }

    return NULL;
}

int main()
{
    // spawn a thread
    pthread_t threadCredit;
    pthread_t threadDebit;

    int i;
    for (i = 0; i < 2; i++)
    {
        if (i == 0)
            pthread_create(&threadCredit, NULL, &threadFunc, "credit");
        else
            pthread_create(&threadDebit, NULL, &threadFunc, "debit");
    }

    pthread_join(threadCredit, NULL);
    pthread_join(threadDebit, NULL);

    printf("[final] solde = %d\n", solde);
    return 0;
}

私が得るのは時々です:
[debit-start] solde = 250
[debit-end] solde = 220 (-30)
[credit-start] solde = 250 // <= I wouldnt get this with mutex
[credit-end] solde = 10220 (+10000)
[final] solde = 10220

そして時折:
[credit-start] solde = 250
[credit-end] solde = 10250 (+10000)
[debit-start] solde = 250 // <= I wouldnt get this with mutex
[debit-end] solde = 10220 (-30)
[final] solde = 10220

しかし、 をresult使用しなくても、 が正しいことがわかりますmutex。私が取得しようとしているのは、次のような間違った結果です(2つthreadsは初期値250で始まります):

[credit-start] solde = 250
[credit-end] solde = 10250 (+10000)
[debit-start] solde = 250
[debit-end] solde = 220 (-30)
[final] solde = 220

PS:pthreadミューテックスaround the inner content ofスレッド関数` を使用すると、結果はより多くのロジックになります。

[debit-start] solde = 250
[debit-end] solde = 220
[credit-start] solde = 220
[credit-end] solde = 10220
[final] solde = 10220

また:

[credit-start] solde = 250
[credit-end] solde = 10250
[debit-start] solde = 10250
[debit-end] solde = 10220
[final] solde = 10220

4

1 に答える 1