try 以高性能的方式同步调用函数,仅使用全局变量
我正在try 通过以下方式同步调用函数foo
:
bool global_var=0;
void* task(void*) {
while(global_var);
global_var=1;
foo();
global_var=0;
}
那么,从多个线程调用任务()会导致数据竞争或未定义的行为吗?
try 以高性能的方式同步调用函数,仅使用全局变量
我正在try 通过以下方式同步调用函数foo
:
bool global_var=0;
void* task(void*) {
while(global_var);
global_var=1;
foo();
global_var=0;
}
那么,从多个线程调用任务()会导致数据竞争或未定义的行为吗?
是的,没有什么能保证在您退出while(global_var);
之后布尔值不会立即被修改
在我看来,您试图这样做是为了确保只有一个线程可以同时运行foo()
.已经有专门用于此任务的对象,称为mutex.假设您使用的是pthread.h
:
#include <pthread.h>
pthread_mutex_t lock;
int init_lock()
{
return pthread_mutex_init(&lock, NULL);
}
void task()
{
pthread_mutex_lock(&lock);
foo();
pthread_mutex_unlock(&lock);
}
这是我认为您正在try 做的事情的正确方式.互斥体是专门为保护共享资源而设计的.
我建议您阅读有关互斥锁、信号量和原子变量的知识.