首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何正确使用互斥锁作为线程中成员函数的参数?

如何正确使用互斥锁作为线程中成员函数的参数?
EN

Stack Overflow用户
提问于 2019-04-16 06:10:11
回答 1查看 66关注 0票数 1

我的问题是我不知道如何正确使用互斥。我知道理论上它是如何工作的,但我不知道为什么它不能在我的代码中工作,我想如果我在变量上使用互斥,它将被阻塞,直到它被解锁。然而,看起来我仍然有一场数据竞赛。

我尝试在main中定义一个类互斥锁和一个互斥锁,并通过引用传递。不知何故,这些都不起作用。

代码语言:javascript
复制
class test {
public:
    void dosmth(std::mutex &a);
    int getT(){return t;};

private:
    int t = 0;
};


void test::dosmth(std::mutex &a) {
    for(;;){
        a.lock();
        t++;
        if(t==1000){
            t=0;
        }
        a.unlock();
    }
}

int main() {
    test te;
    std::mutex help;
    std::thread t(&test::dosmth, std::addressof(te), std::ref(help));
    for(;;){
        for (int i = 0; i <te.getT() ; ++i) {
            std::cout<<te.getT()<<std::endl;
        }
    }
}

结果应该是我得到了一些输出,所以我现在可以工作了。

EN

回答 1

Stack Overflow用户

发布于 2019-04-16 06:24:32

正如Michael提到的,您应该同步阅读器和编写器,以避免未定义的行为。与将mutex作为参数传递不同,一种常见的模式是使mutex成为对象(te)的成员,每当您进入成员函数(修改对象的内部状态)时锁定和解锁(首选lock_gaurd,而不是手动锁定和解锁)。下面是一些伪代码:

代码语言:javascript
复制
class Foo{
    std::mutex m; // reader and writer are sync'ed on the same mutex
    int data_to_sync;
public:
    int read(){
        lock_gaurd<mutex> lg(m); //RAII lock
        return data_to_sync;
        //automagically released upon exit
    }
    void write(){
        lock_gaurd<mutex> lg(m);
        data_to_sync++;
    }
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55697873

复制
相关文章

相似问题

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