c++ - 如何在main函数中直接使用Locks
问题描述
在我的主要功能中,我试图实现类似于下面的多线程,
#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: error: binding reference of type 'std::lock_guard::mutex_type& {aka std::mutex&}' to 'const std::mutex' 丢弃限定符 std::lock_guard lockGuard(myMutex );
有什么聪明的方法可以解决这个问题吗?
解决方案
您的代码中有两个问题可能会导致编译错误,但它们都可以通过引用捕获互斥锁来解决。就目前而言,您的代码正在尝试按值捕获互斥锁,因为它包含在默认的=
.
第一个问题是不能按值捕获互斥锁,因为互斥锁是不可复制的。第二个问题是,即使您可以按值捕获互斥锁,捕获的互斥锁也会const
在 lambda 主体内,这意味着它无法被锁定。(事实上,你不能对引用做任何事情。)const
std::mutex
同样,这两个问题都可以通过引用捕获来解决。(虽然,生成的代码仍然没有意义,因为它似乎强制两个线程串行运行。)
推荐阅读
- javascript - 这行代码在数组中找到最大元素,有人可以告诉我这段代码是如何使用reduce完成的吗?
- c - 我什么时候应该释放双指针?
- angular - MathJax 未定义角度 4
- c# - 如何在 rdlc 文件中使用表控件而不在 C# windows 窗体应用程序中使用任何数据库
- react-native - 意外使用保留字'import React-native
- oauth-2.0 - OpenIdConnect 的 id_token 是干什么用的?
- ruby-on-rails - 试图从 pdftables api 调用中保存 xml 文件
- netty - 理解 Netty 3 中 MemoryAwareThreadPoolExecutor 的行为
- android - 如何在抽屉菜单中为单个菜单项添加图标?
- android - 禁用在布局内单击 RadioGroup