为每个线程复制的C ++成员变量(类似thread_local)

时间:2017-09-02 17:52:27

标签: c++ multithreading global-variables thread-local

我有一个对象,在初始化期间创建了几个shared memories。 每个共享内存(HANDLE,名称,缓冲区指针等)的不同属性存储在我创建的结构中,并在vector<SharedMemory>中推送。 完成此操作后,它会在函数MyClass::Server(unsigned int sharedMemoryID)上创建尽可能多的线程,因为它创建了共享内存。 sharedMemoryIDvector中共享内存的ID,这样Server()知道要使用哪个共享内存。 然后它准备好提供请求(我使用共享内存作为Inter Process Communication system)。 这样,每个线程都使用自己的私有共享内存,我可以并行处理多个请求。 我将thread存储在我的班级map<unsigned int, thread> m_servers的成员变量中。 我还有一个函数在名为MyClass::Send(unsigned int sharedMemoryID, const void* source, unsigned int length)

的共享内存中发送请求和响应

我希望避免在sharedMemoryID之后调用的每个函数都必须传递Server(),因为所有与发送和接收相关的函数只能在Server()之后调用是多余的。 为此,我希望有一个成员变量unsigned int m_serverID,它在每个线程中都有自己的副本,并且在Server()执行时会立即编写。这样,之后调用的所有其他函数都可以避免使用sharedMemoryID作为参数,并且jsut从此成员变量特定于线程获取要使用的ID。

我尝试在我的班级thread_local unsigned int m_serverID;中添加,但它说线程本地存储类在这里无效。有一件事是在我的班级之外声明 static thread_local unsigned int serverID;然后从我的线程中更改它,但我希望在我的对象中有这个变量,而不是全局。

我在StackOverflow和Google上搜索过,很多人似乎都说我正在寻找的东西没有意义,我不得不承认我不太明白为什么。

你能告诉我是否有办法让成员变量成为本地线程,如果没有,你能否提出替代方案,并告诉我为什么不能这样做呢?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

"The thread_local keyword is only allowed for objects declared at namespace scope, objects declared at block scope, and static data members."

原因是成员变量是对象实例的值(并存储在该实例地址的商品中),并且在没有整个实例thread_local的情况下使其成为thread_local是没有意义的。 / p>

一些解决方案是使变量变为静态(你的对象是Singleton / God类吗?因为它看起来像是这样),将服务器和相关函数放入它们自己的类中,并在创建线程或传递时对其进行实例化周围的价值。