在我的主要功能中,我正在尝试实现类似于下面的多线程,
#include <thread>
#include <mutex>
....
int main(int argc, char *argv[])
{
std::mutex myMutex;
while(...) {
//some code
std::thread t1([=,&myArr](){
std::lock_guard<std::mutex> lockGuard(myMutex);
for(int i=0; i<1000; i++) {
myArr[i] = alpha*(myArr[i] - t*myArr[i-1]) ;
}
});
std::thread t2([=,&myArr](){
std::lock_guard<std::mutex> lockGuard(myMutex);
for(int i=1000; i<2000; i++) {
myArr[i] = alpha*(myArr[i] - t*myArr[i-1]) ;
}
});
t1.join();
t2.join();
}
return 0;
}
当我像这样运行代码时,myArr 数组没有按我的意愿更新。由于竞争条件。并且'''lock_guard'''应该有助于从我的网络搜索中解决这个问题。但是我对如何将其添加到这段代码感到有点困惑。我尝试直接添加如下:
{
t1.join();
std::lock_guard<std::mutex> lockGuard(myMutex);
}
{
t2.join();
std::lock_guard<std::mutex> lockGuard(myMutex);
}
但它给出了错误:mycode.cpp:2127: 错误:类型 'std::lock_guard::mutex_type& {aka std::mutex&}' 到 'const std::mutex' 的绑定(bind)引用丢弃限定符 std::lock_guard锁卫(我的互斥体);
有什么聪明的方法可以解决这个问题吗?
最佳答案
您的代码中有两个问题可能会导致编译错误,但它们都可以通过引用捕获互斥锁来解决。就目前而言,您的代码试图按值捕获互斥量,因为它包含在 =
的默认值下。
第一个问题是互斥锁不能按值捕获,因为互斥锁是不可复制的。第二个问题是,即使您可以按值捕获互斥量,捕获的互斥量在 lambda 主体内将是 const
,这意味着它无法被锁定。 (事实上 ,您不能对 std::mutex
的 const
引用做任何。)
同样,这两个问题都可以通过引用捕获来解决。 (虽然,生成的代码仍然没有意义,因为它似乎强制两个线程串行运行。)
关于c++ - 如何直接在main函数中使用Locks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59056547/