c – 如何使用pthreads读/写共享变量?
发布时间:2020-12-16 09:23:43 所属栏目:百科 来源:网络整理
导读:我有两个线程,在 linux上使用C pthreads.其中一个写入数据,另一个正在读取数据.我正在使用一个变量来允许读取线程,当允许读取时,写入一个是允许的.因此,互斥锁适用于这个名为“newData”的布尔变量.我的问题是:我是否需要在“if”条件内的访问周围锁定/解锁
我有两个线程,在
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 ); } 解决方法
这是从您的第一个版本派生出来的 – 它有点简单.
线程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); 它取决于格子信息的确切使用方式,但考虑到互斥体的名称,我认为你应该在修改晶格时保持锁定,因此标记为“忽略”的两对线条?应该删除.否则,不保护晶格不受并发访问的影响. 补充:我认为第二个版本是错误的 – 它没有正确保护晶格. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |