我有一个对象,在初始化期间创建了几个shared memories。
每个共享内存(HANDLE
,名称,缓冲区指针等)的不同属性存储在我创建的结构中,并在vector<SharedMemory>
中推送。
完成此操作后,它会在函数MyClass::Server(unsigned int sharedMemoryID)
上创建尽可能多的线程,因为它创建了共享内存。 sharedMemoryID
是vector
中共享内存的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上搜索过,很多人似乎都说我正在寻找的东西没有意义,我不得不承认我不太明白为什么。
你能告诉我是否有办法让成员变量成为本地线程,如果没有,你能否提出替代方案,并告诉我为什么不能这样做呢?
非常感谢您的帮助。
答案 0 :(得分:0)
原因是成员变量是对象实例的值(并存储在该实例地址的商品中),并且在没有整个实例thread_local的情况下使其成为thread_local是没有意义的。 / p>
一些解决方案是使变量变为静态(你的对象是Singleton / God类吗?因为它看起来像是这样),将服务器和相关函数放入它们自己的类中,并在创建线程或传递时对其进行实例化周围的价值。