在C++中执行以下操作的最佳方式是什么?虽然我目前的方法有效,但我不确定这是最好的方法:
1)我有一个主类,里面有一些函数
2)我有一个线程,它接受套接字上的一些指令,然后运行主类中的一个函数
3)有许多线程可以访问主类中的各种函数
我创建了主类,然后从主类创建了线程类的实例。线程类的构造函数被传递给主类的"this“指针。然后,我可以在线程内的主类中运行函数-例如,我得到一个命令来做一些事情,从线程中运行主类中的函数。我有互斥体的etc来防止竞争问题。
我是不是走错了路-似乎线程类应该继承主类,或者另一种方法是没有单独的线程类,而只是将它们作为主类的函数,但这会变得很丑陋。
发布于 2011-10-18 04:11:36
我觉得不错。在我的服务器中,它被称为“SCB”-- ServerControlBlock --它提供了对服务的访问,比如In缓冲区/套接字池,记录器,状态/错误消息的UI访问,以及所有处理程序线程需要通用的任何其他东西。运行得很好,我不认为这是一个黑客行为。
在创建使用SCB的线程池之前,我创建了SCB (并在ctor中确保通过它访问的所有服务都已启动并准备好使用)-没有讨厌的单件东西。
Rgds,Martin
发布于 2011-10-18 03:04:19
单独的线程类是很正常的,特别是当它们有特定的功能时。我不会从主线程继承。
发布于 2011-10-18 03:31:05
将this指针传递给线程本身并不是坏事。你可以用它做什么。
this指针与任何其他POD-ish数据类型一样。这只是一小块比特。然而,this中的东西可能不仅仅是PODs,而且由于所有常见的原因,传递实际上是指向它的成员的指针可能是危险的。任何时候你在线程之间共享任何东西,都会引入潜在的竞争条件和死锁。当然,解决这些冲突的基本方法是以互斥锁、信号量等形式引入同步,但这可能具有序列化应用程序的惊人效果。
假设您有一个线程从套接字读取数据并将其存储到同步命令缓冲区,另一个线程从该命令缓冲区读取数据。这两个线程使用相同的互斥锁来保护缓冲区。一切都很好,对吧?
好吧,也许不是。如果您不注意如何锁定缓冲区,您的线程可能会被序列化。假设您为buffer-insert和buffer-remove代码创建了单独的线程,以便它们可以并行运行。但是,如果您在每次插入和每次删除时都锁定缓冲区,那么一次只能执行其中一个操作。只要你写到缓冲区,你就不能从它读取,反之亦然。
您可以尝试对锁进行微调,使其尽可能简短,但只要您拥有共享的、同步的数据,就会有一定程度的序列化。
另一种方法是显式地将数据传递给另一个线程,并尽可能多地删除数据共享。例如,您的套接字代码可能会在堆上创建某种类型的Command对象(例如Command* cmd = new Command(...);),然后将其传递给另一个线程,而不是像上面那样写入和读取缓冲区。(在Windows中,一种方法是通过QueueUserAPC机制)。
这两种方法各有优缺点。同步方法的优点是在表面上更容易理解和实现,但潜在的缺点是,如果你搞砸了什么,调试起来就会困难得多。传递方法可能会使同步所固有的许多问题变得不可能(从而实际上使其变得更简单),但它需要时间在堆上分配内存。
https://stackoverflow.com/questions/7798237
复制相似问题