如何通过pthreads在多线程环境中高效地读写共享变量实现线程安全?
- 内容介绍
- 文章标签
- 相关推荐
本文共计595个文字,预计阅读时间需要3分钟。
我拥有两个线程,在Linux上使用C和pthreads。其中一个线程写入数据,另一个线程正在读取数据。我使用一个变量来允许读取线程,当允许读取时,写入的是一个允许的数据。因此,互斥锁适用于这个名为newDat的线程。
我有两个线程,在 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);
它取决于格子信息的确切使用方式,但考虑到互斥体的名称,我认为你应该在修改晶格时保持锁定,因此标记为“忽略”的两对线条?应该删除.否则,不保护晶格不受并发访问的影响.
补充:我认为第二个版本是错误的 – 它没有正确保护晶格.
本文共计595个文字,预计阅读时间需要3分钟。
我拥有两个线程,在Linux上使用C和pthreads。其中一个线程写入数据,另一个线程正在读取数据。我使用一个变量来允许读取线程,当允许读取时,写入的是一个允许的数据。因此,互斥锁适用于这个名为newDat的线程。
我有两个线程,在 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);
它取决于格子信息的确切使用方式,但考虑到互斥体的名称,我认为你应该在修改晶格时保持锁定,因此标记为“忽略”的两对线条?应该删除.否则,不保护晶格不受并发访问的影响.
补充:我认为第二个版本是错误的 – 它没有正确保护晶格.

