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