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'需要为库函数全局,但不能向用户公开,返回值变得很重要.
这是您当前代码中的事件序列:
x变量.阅读x完全没有保护.
你需要做的是
x变量.这样读取就会被锁保护.为此,x在解锁锁之前将值存储到非共享(本地)变量,并将其用作返回值:
int retval = x;
pthread_mutex_unlock(&mutex);
return retval;
Run Code Online (Sandbox Code Playgroud)