0

我想重现使用两个threads修改global variable: solde. first thread递增和递减它 soldesecond

使用源代码更清楚:

#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. 我想要得到的是这样的错误结果(两者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

1

更改您的线程函数,使其保留数据的本地副本,并在获取副本后让另一个线程运行。这将突出您正在寻找的问题:

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

    return NULL;
}
于 2013-09-21T01:39:30.780 回答