类的多线程和全局实例

Multithreading and Global instances of classes?

本文关键字:全局 实例 多线程      更新时间:2023-10-16

我正在为网络应用程序使用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做类似的事情。但这些标准具有独立于平台的优势。