我想重现使用两个threads修改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。我想要得到的是这样的错误结果(其中两个threads以初始值250开头):

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

附言:当我使用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

最佳答案

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

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;
}

关于c - C-使用pthread重现两个线程之间的全局变量的同步问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18927523/

10-11 16:37