C++ 类的多线程和全局实例?

C++ 类的多线程和全局实例?,c++,c,multithreading,sockets,pthreads,C++,C,Multithreading,Sockets,Pthreads,我第一次在网络应用程序中使用多线程,我的问题是两个相关部分, 例如,如果我用一个类来表示udp中的一组消息,每个消息都是一个类,那么将这些类的实例设置为全局的,以便在不同的线程上发送它们,这是一种好的做法吗,或者更好的方法是使用具有类实例和所有套接字信息的结构作为该结构内部的引用,然后使用Pthread_create 我认为在第一种选择中,必须非常小心,以避免使用pthread_互斥体同时访问数据 请建议你如何处理这个问题 我真的很感激他们的帮助 非常感谢如果我正确理解了您的问题,您计划使用一个

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

我认为在第一种选择中,必须非常小心,以避免使用pthread_互斥体同时访问数据

请建议你如何处理这个问题

我真的很感激他们的帮助


非常感谢

如果我正确理解了您的问题,您计划使用一个侦听器线程来接收消息,并将它们发送给同时处理这些消息的多个线程

在这里,一种可能的方法是使用共享:

listner推送它在队列上接收的消息: 如果队列不是空的,那么工作线程将使用下一个元素来处理front``andpop` 当然,除非使用lokc自由队列实现,否则在使用a读取或写入元素时,队列将被锁定。 只有队列需要共享。您可以使用全局定义来实现这一点。但另一方面,最好尽量避免使用全局变量/对象。因此,最好在创建和启动线程时动态实例化队列,并将对queueue的引用传递给每个线程

对于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();
    }
    ...
其中void listenerstd::queue&q和void workerstd::queue&q将是要执行的函数


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

网络编程不需要使用线程。使用select或您平台的等效工具。或libev。如果您使用c++11或c11方式,并且您的编译器支持线程,则应使用该方式而不是pthreads。避免出现多个线程必须共享一个值从而同步其使用的情况。@JohnZwinck:select或类似方式适用于少量套接字,但仅限于单个CPU。不幸的是,现在,如果你想使用计算机的所有资源,就需要并发性。我想做的是,能够在后台向客户端发送一条句号消息,同时接收来自该客户端的消息,该客户端也发送句号消息。我想创建多线程,在一个线程中我会定期发送定期消息,而在其他线程中执行其余的操作。我的推理正确吗?我在某个地方读到了Select,但我不确定这是否是正确的方法。