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

标签 c++ multithreading locking

在我的主要功能中,我正在尝试实现类似于下面的多线程,

#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::mutexconst 引用做任何。)

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

关于c++ - 如何直接在main函数中使用Locks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59056547/

相关文章:

Java 应用程序在调用PreparedStatement(针对 SQL Server DB)后挂起

c++ - 从 C++ 中的文件读取到行尾?

c++ - QT 5.0 中疯狂的 CPU 使用率

java - 使用什么同步器进行线程初始化?

mysql - 为什么在我刚刚锁定表时给 mysql 错误 ER_TABLE_NOT_LOCKED?

java - 使用synchronized(obj) 和声明锁之间的区别

c++ - 如何使虚函数接受仅在派生类中定义的数据类型?

c++ - Qt:QScrollArea 中的自定义小部件

c# - 为什么使用wcf托管在另一个线程上时,为什么总是总是更改线程ID?

c++ - 提升::亚西欧。消息在哪个线程中发送?