我有两个线程,在linux上使用pthreads。一个是写数据,另一个是读数据。我使用一个变量来允许读线程和写线程。所以互斥锁应用于这个名为"newData“的布尔变量。我的问题是:我是否需要锁定/解锁"if“条件中访问周围的互斥?这两种方法都有效,但我认为这只是因为在this变量上重叠写/读的机会很小。为了更好地解释我的问题,我展示了这两种选择:
线程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 );
}发布于 2009-03-03 18:30:19
这是从您的第一个版本派生而来的-它稍微简单一些。
线程1:写入者
pthread_mutex_lock(&lattice_mutex);
if (!newData) {
pthread_mutex_unlock(&lattice_mutex); // Omit?
uchar *lattice_pos = lattice;
int i;
for (i = 0; i < size; i++)
*lattice_pos++ = rand() % CHAR_MAX;
pthread_mutex_lock(&lattice_mutex); // Omit?
newData = TRUE;
}
pthread_mutex_unlock(&lattice_mutex);线程2:阅读器
pthread_mutex_lock(&lattice_mutex);
if (newData) {
pthread_mutex_unlock(&lattice_mutex); // Omit?
renderUpdate();
pthread_mutex_lock(&lattice_mutex); // Omit?
newData = FALSE;
}
pthread_mutex_unlock(&lattice_mutex);这取决于如何准确地使用晶格信息,但是给定互斥锁的名称,我认为您应该在修改晶格时将其锁定,因此有两对代码行标记为“Omit?”应该被移除。否则,网格不会受到并发访问的保护。
补充:我认为第二个版本是错误的-它没有正确地保护晶格。
发布于 2009-03-03 17:49:54
第一个版本是正确的,在写入和读取时都需要互斥。
然而,AFAIK,几乎所有的体系结构都有对一个数据单元的简单读写访问(例如,int)原子。但是,请注意,在内存排序较弱的体系结构上,您可能会遇到这样的问题:在缓冲区实际包含数据之前,您可能会看到" buffer -full“标志为true。
请注意,代码可能不是您所能做的最好的代码,因为它从不休眠(使用繁忙等待)。如果您希望等待任何一个线程中的数据,则必须对互斥锁使用条件变量。
https://stackoverflow.com/questions/607374
复制相似问题