多线程和类的全局实例?

时间:2014-11-11 06:28:10

标签: c++ c multithreading sockets pthreads

我正在使用mutlithreading'第一次'进行网络应用,我的问题是两个相关的部分, 如果我用udp表示一堆带有类的消息(每个消息都是一个类),那么将这些类的实例设置为全局以便在不同的线程发送它们是不错的做法,或者更好的方法是使用struct有一个类实例和所有套接字信息作为该结构中的引用(然后使用Pthread_create)

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

请建议您如何处理此问题。

我真的很感激帮助

非常感谢

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,您计划拥有一个侦听器线程来接收消息,并将它们分派给多个线程,这些线程可以很快地处理这些消息。

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

  • 列表器push()它在队列中收到的消息:
  • 工作线程,如果队列不是empty(),则使用下一个要处理的元素(front()``and pop()`)
  • 当然,在使用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<my_message_class>& q)void worker(std::queue<my_message_class>& q)将是要执行的函数。

当然,你可以用pthreads做类似的事情。但标准的优势在于平台无关。