首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用pthread读/写共享变量?

如何使用pthread读/写共享变量?
EN

Stack Overflow用户
提问于 2009-03-03 17:38:29
回答 2查看 4.8K关注 0票数 3

我有两个线程,在linux上使用pthreads。一个是写数据,另一个是读数据。我使用一个变量来允许读线程和写线程。所以互斥锁应用于这个名为"newData“的布尔变量。我的问题是:我是否需要锁定/解锁"if“条件中访问周围的互斥?这两种方法都有效,但我认为这只是因为在this变量上重叠写/读的机会很小。为了更好地解释我的问题,我展示了这两种选择:

线程1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
if(newData) {
    renderUpdate();
    pthread_mutex_lock( &lattice_mutex );
    newData = FALSE;
    pthread_mutex_unlock( &lattice_mutex );
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-03 18:30:19

这是从您的第一个版本派生而来的-它稍微简单一些。

线程1:写入者

代码语言:javascript
复制
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:阅读器

代码语言:javascript
复制
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?”应该被移除。否则,网格不会受到并发访问的保护。

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

票数 4
EN

Stack Overflow用户

发布于 2009-03-03 17:49:54

第一个版本是正确的,在写入和读取时都需要互斥。

然而,AFAIK,几乎所有的体系结构都有对一个数据单元的简单读写访问(例如,int)原子。但是,请注意,在内存排序较弱的体系结构上,您可能会遇到这样的问题:在缓冲区实际包含数据之前,您可能会看到" buffer -full“标志为true。

请注意,代码可能不是您所能做的最好的代码,因为它从不休眠(使用繁忙等待)。如果您希望等待任何一个线程中的数据,则必须对互斥锁使用条件变量。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/607374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档