将 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作为参数传递给虚拟函数调用时发生