可以在互斥锁解锁和从函数返回之间发生竞争条件

Ank*_*ush 3 c multithreading mutex

我一直在学习多线程应用程序,特别是关于如何使用互斥锁来防止竞争条件.但是,在编写代码时,我在代码中发现了竞争条件(使用helgrind工具valgrind),我相信在解锁之后和返回之前,一个线程中的执行可能会暂停.

如果我们采用下面的示例代码,互斥锁解锁和返回语句之间是否存在竞争条件?如果是这样,我们如何解决这个问题?(不要求调用者传入某种缓冲区并返回一个常量值0)

#include <pthread.h>

int x = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

doSomething()
{
    pthread_mutex_lock(&mutex);
    ++x;
    pthread_mutex_unlock(&mutex);
               /* <-- Race Condition? */
    return x;
}

void *t2()
{
    doSomething();
}

main()
{
    pthread_t thread;
    pthread_t_create(&thread, NULL);
    doSomething();
    pthread_join(thread, NULL);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意:我理解在上面的例子中,返回'x'是没用的,因为x是全局的.但是,在库中,'x'需要为库函数全局,但不能向用户公开,返回值变得很重要.

use*_*ica 8

这是您当前代码中的事件序列:

  1. 解锁锁.
  2. 阅读共享x变量.
  3. 返回您读取的值.

阅读x完全没有保护.

你需要做的是

  1. 阅读共享x变量.
  2. 解锁锁.
  3. 返回您读取的值.

这样读取就会被锁保护.为此,x在解锁锁之前将值存储到非共享(本地)变量,并将其用作返回值:

int retval = x;
pthread_mutex_unlock(&mutex);
return retval;
Run Code Online (Sandbox Code Playgroud)