首页 > 解决方案 > 如何在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 );

有什么聪明的方法可以解决这个问题吗?

标签: c++multithreadinglocking

解决方案


您的代码中有两个问题可能会导致编译错误,但它们都可以通过引用捕获互斥锁来解决。就目前而言,您的代码正在尝试按值捕获互斥锁,因为它包含在默认的=.

第一个问题是不能按值捕获互斥锁,因为互斥锁是不可复制的。第二个问题是,即使您可以按值捕获互斥锁,捕获的互斥锁也会const在 lambda 主体内,这意味着它无法被锁定。(事实上​​,你不能对引用做任何事情conststd::mutex

同样,这两个问题都可以通过引用捕获来解决。(虽然,生成的代码仍然没有意义,因为它似乎强制两个线程串行运行。)


推荐阅读