【问题标题】:C - Reproduce synchronization issue of a global variable between two threads with pthreadC - 使用 pthread 在两个线程之间重现全局变量的同步问题
【发布时间】:2013-09-21 09:39:30
【问题描述】:

我想重现我们在使用两个 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 // &lt;= 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 // &lt;= 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

P.S:当我使用pthreadmutexaround the inner content ofthread 函数时,结果更符合逻辑:

[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

【问题讨论】:

    标签: c pthreads mutex


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-08
      • 2013-10-21
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      相关资源
      最近更新 更多