从成员函数中的lambda捕获互斥锁

时间:2014-07-29 14:10:18

标签: c++ multithreading lambda

这段代码只是一个例子,它运行得很好,因为没有什么不好可能发生,因为它只是一个例子而不是真实的世界程序。

虽然代码运行但我担心必须有一些不好的东西,因为我在我的其他项目中使用与此示例相同的模式时出现分段错误。 (我写这个例子是为了让问题可以理解,在这个例子之后是一个函数 从我的项目,多个线程访问)

#include <thread>
#include <iostream>
#include <chrono>
#include <mutex>

std::mutex mtx;

struct foo
{
    int var = 0;

    void bar()
    {
        std::thread t([&, this](){

            for(int i = 1; i < 8; ++i)
            {
                mtx.lock();
                var++;
                mtx.unlock();
                std::cout << "inside bar" << std::endl;
                std::this_thread::sleep_for(std::chrono::milliseconds(100));
            }});
        t.detach();
    }
};

int main()
{
    foo x, y, z;
    x.bar();
    y.bar();
    z.bar();
    std::this_thread::sleep_for(std::chrono::seconds(100));
    return 0;
}

正如我所说的上述程序有效,但我不确定它是否安全,因为类似的东西在我当前的项目中不起作用......

这是我的项目中的一个函数(类似于上面的bar成员函数),它同时被同一个类的不同对象访问, 更改颜色并绘制导致分段错误的窗口小部件:

std::mutex mtx;

void HField::blink()
{
    std::thread t([&, this](){
        Gdk::RGBA color = Gdk::RGBA("Medium Blue");
        Gdk::RGBA temp = m_background;  // m_background is a RGBA member

        for(int i = 1; i < 8; ++i)
        {
            mtx.lock();
            if(i % 2) m_background = color;
            else m_background = temp;
            mtx.unlock();
            queue_draw();
            std::this_thread::sleep_for(std::chrono::milliseconds(500));
        }
        m_background = temp;
        queue_draw();});

    t.detach();
}

0 个答案:

没有答案