我有一个函数 ( my_func
),它可以由具有多个线程的程序调用。而且我不希望这个函数同时执行两次或更多次。因为我在记忆中写作,我不希望他们同时写作。
void my_func()
{
// I want a line that blocks the execution if one is still pending
/* the code here */
}
我有一个函数 ( my_func
),它可以由具有多个线程的程序调用。而且我不希望这个函数同时执行两次或更多次。因为我在记忆中写作,我不希望他们同时写作。
void my_func()
{
// I want a line that blocks the execution if one is still pending
/* the code here */
}
在函数开始时使用互斥锁并在退出函数之前使用互斥锁解锁
pthread_mutex_t my_func_mutex = PTHREAD_MUTEX_INITIALIZER;
void my_func()
{
pthread_mutex_lock(&my_func_mutex); // at the beginning of your function
.....
pthread_mutex_unlock(&my_func_mutex); // do not forget to unlock your mutex before going out from your function
}
如果你愿意,你可以用其他方式来做:
pthread_mutex_t my_func_mutex = PTHREAD_MUTEX_INITIALIZER;
#define MY_FUNC_MACRO() \
do { \
pthread_mutex_lock(&my_func_mutex); \
my_func(); \
pthread_mutex_unlock(&my_func_mutex); \
} while(0)
void my_func()
{
.....
}
在你的代码中你调用MY_FUNC_MACRO()
而不是my_func()
在写入同一位置时避免冲突的一种方法是确保按顺序完成写入。一种方法是使用互斥锁
int a = functionThatTakesALongTime();
pthread_mutex_lock(&mymutex);
sum+=a;
pthread_mutex_unlock(&mymutex);