指向具有互斥锁的结构的指针的c ++映射

时间:2018-02-23 20:15:15

标签: c++ c++11 mutex

我需要为我创建的每个对象保留std::mutex以便稍后使用。

我知道std::mutex是不可复制的不可移动的。

我也看过这个:

map-of-mutex-c11

我所做的是,使用std::map(密钥)和objectID创建objectInfo* ,并在objectInfo中使用互斥锁。

所以,因为我在地图中存储的是指向某个结构的指针,所以我没有看到std::mutex的任何问题,如果我有std::map<int, std::mutex>,那就会发生。{ / p>

但是,我写的代码似乎有些问题。在使用互斥锁插入代码后,有时候我会segfault std::unique_lock::try_lock。{/ p>

这是我在大型项目中插入的代码的最小化版本:

// Example program
#include <iostream>
#include <string>
#include <mutex>
#include <map>
#include <thread>

struct sObjectInfo {
    std::mutex mut;
};

std::map<int, sObjectInfo*> mymap;

void foo() {
    std::unique_lock<std::mutex> ulock(mymap[0]->mut, std::defer_lock);
    if (ulock.try_lock()) {
        std::cout << "locked.." << std::endl;
    }
    else {
        std::cout << "cant lock" << std::endl;
    }
}

int main()
{
  sObjectInfo* s1 = new sObjectInfo();
  sObjectInfo* s2 = new sObjectInfo();

  mymap[0] = s1;
  mymap[1] = s2;

  std::thread t1(foo);
  t1.join();
}

以下是实例:

ideone

在这个例子中使用互斥锁有什么问题?

0 个答案:

没有答案