类的多线程和全局实例
Multithreading and Global instances of classes?
我正在为网络应用程序使用mutlithreading"第一次",我的问题有两个相关部分,例如,如果我在udp中用一个类来表示一堆消息(每个消息都是一个类),那么让这些类的实例全局化以便在不同的线程上发送它们是一种好的做法吗?或者更好的方法是使用一个具有类实例和所有套接字信息的结构作为该结构内部的引用(然后使用Pthread_create)
我认为,在第一种选择中,必须非常小心,以避免同时访问数据(使用pthread_mutex)
请建议你如何处理这个问题。
我真的很感谢的帮助
非常感谢
如果我正确理解你的问题,你计划有一个监听器线程来接收消息,并将它们分派给几个同时处理这些消息的线程。
在这里,一种可能的方法是使用共享队列:
- 列表器
push()
在队列中接收到的消息: - 如果队列不是
empty()
,则工作线程获取下一个要处理的元素(front()``and
pop()`) - 当然,当使用互斥体读取或写入元素时,队列应该被锁定,除非您使用无lokc的队列实现
只有队列需要共享。您可以使用全局定义来完成此操作。但另一方面,最好尽可能避免全局变量/对象。因此,最好在创建和启动线程时动态实例化队列,并将对队列的引用传递给每个线程。
对于C++11标准线程,它看起来有点像:
...
std::queue<my_message_class> work_to_do; // create queue
std::thread t1(listener, std::ref(work_to_do)); // launch listener
int n = max(2, std::thread::hardware_concurrency()-1); // maximize concurency for the hardware
std::vector<std::thread> workers;
for (int i = 0; i < n; i++) {
v.push_back(std::thread{ worker_function, std::ref(work_to_do) });
}
... // do something else and wait until it finishes
t1.join(); // wait until listner finishes
for (auto& x : workers) { // wait until all the worker threads finish.
x.join();
}
...
其中CCD_ 4和CCD_。
当然,您可以用pthreads做类似的事情。但这些标准具有独立于平台的优势。
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 如何创建一个空的全局类并在启动时实例化它
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- 类与命名空间的全局实例
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?
- 如何在C++中动态分配全局字符数组中的类实例?
- 如何强制调用类的全局实例的析构函数和构造函数(以便"re-init"类实例)
- 如何在C++中创建"全局"实例?
- 如何从函数中创建类的全局实例
- C++/Clr 中C++全局实例上的多线程
- 通过其他文件中的另一个全局变量使用类的全局实例
- C++-防止全局实例化
- 用c++对象的全局实例扩展嵌入式python解释器
- 为什么GCC将对全局实例构造函数的调用放在不同的部分(取决于目标)
- 在 MFC 中,为什么我需要创建 CWinApp 的全局实例
- 我可以有一个异常的静态全局实例吗?
- 类的多线程和全局实例
- 类的全局实例(跨多个文件)
- 为什么我不能将此全局实例化为指针
- 创建构造函数引用全局变量的类的全局实例时,C++ 程序崩溃