У меня есть два потока, использующих C pthreads на Linux. Один из них записывает данные, а другой читает их. Я использую переменную, чтобы разрешить поток чтения, когда разрешено чтение, и запись, когда разрешено. Таким образом, мьютекс применяется к этой логической переменной с именем "newData". У меня вопрос: нужно ли блокировать / разблокировать мьютекс вокруг доступа внутри условия «если»? Оба способа работают, но я думаю, только потому, что шансы перекрытия записи / чтения над этой переменной очень малы. Я показываю обе альтернативы, чтобы лучше объяснить мой вопрос:
Тема 1:
pthread_mutex_lock( &lattice_mutex );
if (!newData) {
pthread_mutex_unlock( &lattice_mutex );
uchar *lattice_pos = lattice;
int i;
for(i=0; i<size; i++) {
*lattice_pos = rand()%CHAR_MAX;
lattice_pos++;
}
pthread_mutex_lock( &lattice_mutex );
newData = TRUE;
pthread_mutex_unlock( &lattice_mutex );
} else {
pthread_mutex_unlock( &lattice_mutex );
}
Тема 2:
pthread_mutex_lock( &lattice_mutex );
if(newData) {
pthread_mutex_unlock( &lattice_mutex );
renderUpdate();
pthread_mutex_lock( &lattice_mutex );
newData = FALSE;
pthread_mutex_unlock( &lattice_mutex );
} else {
pthread_mutex_unlock( &lattice_mutex );
}
Вторая версия, которая работает, но я не знаю, верна ли она:
Тема 1:
if (!newData) {
uchar *lattice_pos = lattice;
int i;
for(i=0; i<size; i++) {
*lattice_pos = rand()%CHAR_MAX;
lattice_pos++;
}
pthread_mutex_lock( &lattice_mutex );
newData = TRUE;
pthread_mutex_unlock( &lattice_mutex );
}
Тема 2:
if(newData) {
renderUpdate();
pthread_mutex_lock( &lattice_mutex );
newData = FALSE;
pthread_mutex_unlock( &lattice_mutex );
}