如何直接在main函数中使用Locks

How to use Locks in the main function directly

在我的主函数中,我正在尝试实现类似于下面的多线程,

#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' 丢弃限定符 std::lock_guard lockGuard(myMutex);

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

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

的默认值下

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

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