【发布时间】:2011-01-17 22:48:06
【问题描述】:
我正在学习 C。我正在编写一个具有多个线程的应用程序;我知道当一个变量在两个或多个线程之间共享时,最好使用互斥锁来锁定/解锁,以避免死锁和变量不一致。当我想更改或查看一个变量时,这一点非常清楚。
int i = 0; /** Global */
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
/** Thread 1. */
pthread_mutex_lock(&mutex);
i++;
pthread_mutex_unlock(&mutex);
/** Thread 2. */
pthread_mutex_lock(&mutex);
i++;
pthread_mutex_unlock(&mutex);
我认为这是正确的。变量i,在执行结束时,包含整数2。
无论如何,在某些情况下,我不知道将两个函数调用放在哪里。
例如,假设您有一个函数obtain(),它返回一个全局变量。我需要从两个线程中调用该函数。我还有另外两个线程调用函数set(),定义了一些参数;此函数将设置相同的全局变量。当您需要在获取/设置 var 之前执行某些操作时,这两个函数是必需的。
/** (0) */
/** Thread 1, or 2, or 3... */
if(obtain() == something) {
if(obtain() == somethingElse) {
// Do this, sometimes obtain() and sometimes set(random number) (1)
} else {
// Do that, just obtain(). (2)
}
} else {
// Do this and do that (3)
// If # of thread * 3 > 10, then set(3*10) For example. (4)
}
/** (5) */
我必须在哪里锁定,我必须在哪里解锁? 我认为情况可能更加复杂。我将不胜感激。
提前谢谢你。
——阿尔贝托
【问题讨论】: