【发布时间】:2010-10-11 01:53:35
【问题描述】:
我有两个线程,在 linux 上使用 C pthreads。其中一个写入数据,另一个正在读取数据。我正在使用一个变量来允许读取线程何时允许读取并允许写入线程。所以互斥锁适用于这个名为“newData”的布尔变量。我的问题是:我是否需要在“if”条件内锁定/解锁访问周围的互斥锁?两种方式都有效,但我认为只是因为在这个变量上重叠写/读的机会很少。我展示了这两种选择来更好地解释我的问题:
线程 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 );
}
【问题讨论】:
-
简单地说,标准说如果你想访问一个变量,而另一个线程正在或可能正在修改它,你需要一个互斥锁。您可能具有允许您避免这种情况的特定于平台的功能(例如原子操作),但是在所有访问周围使用互斥锁是保证在所有平台上工作的方式。