将 std::map 对象传递给线程

Posted

技术标签:

【中文标题】将 std::map 对象传递给线程【英文标题】:pass std::map object to thread 【发布时间】:2017-06-27 19:44:54 【问题描述】:

Mycode 试图传递一个 std::map 作为对线程的引用,但似乎有些东西不好并导致

error: invalid conversion from ‘void* (*)(std::map<std::basic_string<char>,
       std::vector<std::basic_string<char> > >)’ to ‘void* (*)(void*)’ [-fpermissive]

我需要通过 映射到线程并在该线程中插入映射的键和值,成功后。在主进程中,我需要在同一映射的另一个对象中更新或复制(线程映射),即 myMapcache

int main()

std::map< std::pair<std::string , std::string> , std::vector<std::string> > myMap,myMapCache;

  pthread_t threads;

  //how to pass map object in thread as reference

  int rc = pthread_create(&threads, NULL, myfunction, std::ref(myMap)); 
  if (rc)
  
     cout << "Error:unable to create thread," << rc << endl;
     exit(-1);
   

   // if true then update to local myMapCache

   if(update)
    
      std::copy(myMap.begin(), myMap.end(), std::inserter(MyMapCache, myMapCache.end()) );
     




void * myfunction (std::map< std::pair<std::string , std::string> , std::vector<std::string> >& myMap)


  // here i will insert data in a map
  myMap[std::make_pair(key1,key2)].push_back(value);

  // if update make the flag true
    Update=true;  




【问题讨论】:

如果您可以访问 C++11 或更高版本,我建议您使用 std::thread 而不是 pthread_xxx pthread_create 看起来是否理解 std::reference_wrapper 【参考方案1】:

pthread_create 不是模板,它不理解 C++ 类型。它需要一个void*,这是 C 库为了伪造模板(有点)所做的。

你可以传递一个强制转换的指针而不是一个 C++ 引用包装对象:

int rc = pthread_create(&threads, NULL, myfunction, static_cast<void*>(&myMap)); 
// ...
void* myfunction(void* arg)

   using T = std::map<std::pair<std::string, std::string>, std::vector<std::string>>;
   T& myMap = *static_cast<T*>(arg);

...或者,更好的是,使用boost::thread (C++98) 或std::thread (C++11 及更高版本) 来获取type safety and a longer lifespan。你不是在写 C 程序。

【讨论】:

您链接的问题的答案主要是说std::thread 不能在所有平台上可靠地工作。我不知道它们是最新的,但我没有找到更长寿命的提及...... 谢谢,但如果我尝试传递两张地图而不是一张呢? @tobi303:这些答案已经有五年的历史了。取出时间敏感的抱怨并吸收一般主题。至于寿命,好吧,如果你想用 C 回调让自己患上癌症,我猜这就是你的电话:) @robo:嗯,你不能。你只能传递一个指针。如果您愿意,可以将指针传递给其中包含其他两个指针的结构。但是,再一次,你真的在​​限制自己使用这种古老的 C 技术。 对不起,我没有得到寿命的东西。 C 回调的直接替代品是什么?

以上是关于将 std::map 对象传递给线程的主要内容,如果未能解决你的问题,请参考以下文章

通过指针将堆栈分配的对象传递给在另一个线程上执行的函数

EXC_BAD_ACCESS(code = 1,address = 0x0)当将std :: map作为参数传递给虚拟函数调用时发生

多线程篇五:多个线程访问共享对象和数据的方式

将 COM 对象传递给 VB 6 并打开监视窗口时出现 VariantClear 异常

如何将参数传递给已经开始运行的线程

如何将库类或对象传递给片段?