Я изучаю 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) */
Где мне нужно заблокировать, и где я должен разблокировать? Ситуация может быть, я думаю, еще сложнее. Я по достоинству оценю исчерпывающий ответ.
Спасибо заранее.
-Alberto