【问题标题】:Multithreading and Global instances of classes?类的多线程和全局实例?
【发布时间】:2015-01-07 15:34:14
【问题描述】:

我在网络应用程序中使用多线程“第一次”,我的问题是两个相关部分, 例如,如果我用一个类(每个消息一个类)表示 udp 中的一堆消息,那么将这些类的实例设为全局以便在不同的线程上发送它们是一个好习惯,或者更好的方法是使用具有类实例的结构和所有套接字信息作为该结构内的引用(然后使用 Pthread_create )

我认为在第一个选项中,必须非常小心以避免同时访问数据(使用 pthread_mutex)

请建议您如何解决这个问题。

非常感谢您的帮助

非常感谢

【问题讨论】:

  • 网络编程不需要使用线程。使用select() 或您平台的等效项。或libev.
  • 如果你使用 c++11 或 c11 方式,并且你的编译器支持线程,你应该使用它而不是 pthreads。
  • 避免许多线程必须共享一个值(从而同步其使用)的情况。
  • @JohnZwinck: select 或类似的方法适用于少量套接字,但限制您使用单个 CPU。遗憾的是,如今,如果您想使用计算机的所有资源,就需要并发。
  • 我想要做的是,能够在后台向客户端发送周期消息,同时接收来自该客户端的消息,该客户端也发送周期消息。我想创建多线程,在一个线程中我会定期发送周期性消息,而其余的则在其他线程中完成。我的推理是否正确,我在某处阅读过使用 Select,但我不确定这是否可行。

标签: c++ c multithreading sockets pthreads


【解决方案1】:

如果我正确理解您的问题,您计划有一个侦听器线程来接收消息并将它们分派到同时处理这些消息的多个线程。

这里可能的方法是使用共享的queue

  • 监听器push()它在队列中收到的消息:
  • 工作线程,如果队列不是empty(),则取下一个元素处理(front()``andpop()`)
  • 当然,当使用mutex 读取或写入元素时,队列应被锁定,除非您使用无 lokc 队列实现。

只有队列需要共享。您可以使用全局定义来做到这一点。但另一方面,最好尽可能避免使用全局变量/对象。因此,您最好在创建和启动线程时动态地实例化队列,并将对队列的引用传递给每个线程。

使用 C++11 standard threads 它看起来有点像:

    ... 
    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();
    }
    ...

void listener(std::queue&lt;my_message_class&gt;&amp; q)void worker(std::queue&lt;my_message_class&gt;&amp; q) 将是要执行的函数。

当然,你可以用 pthread 做类似的事情。但是标准的具有独立于平台的优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多