C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 如何使用pthreads读/写共享变量?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个线程,在 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);

它取决于格子信息的确切使用方式,但虑到互斥体的名称,我认为你应该在修改晶格时保持锁定,因此标记为“忽略”的两对线条?应该删除.否则,不保护晶格不受并发访问的影响.

补充:我认为第二个版本是错误的 – 它没有正确保护晶格.

大佬总结

以上是大佬教程为你收集整理的c – 如何使用pthreads读/写共享变量?全部内容,希望文章能够帮你解决c – 如何使用pthreads读/写共享变量?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。