2011-10-17 68 views
1

在C++中执行以下操作的最佳方式是什么?虽然我目前的方法效果我不知道这是去的最佳途径:将“this”传递给线程C++

1)我有一个其中有

2)一些函数级的高手我有一个线程,呈现出一些指令插座,然后运行在主类的功能的一个

3)有许多线程的访问的各种功能在主类

我创建主类,然后创建从线程类的实例大师。线程类的构造函数传递给master的“this”指针。然后,我可以在线程内部的主类中运行函数 - 即,我得到一个命令来执行一些在线程中在主类中运行函数的功能。我有互斥等等,以防止种族问题。

我对这种错误的方式 - 它看起来像线程类应该继承主类或另一种方法将不具有单独的线程类,但只有他们作为主类的功能,但变得丑陋。

+1

你能发表一些代码吗?你知道类和实例之间的区别吗?每个线程是否有一个主类实例? –

+0

不,有一个主线程从中产生线程。线程只需要访问主成员函数和一些变量 –

回答

1

听起来不错。在我的服务器中,它被称为'SCB' - ServerControlBlock - 并提供对IOCPbuffer /套接字池,记录器,用于状态/错误消息的UI访问等服务的访问以及所有处理程序线程需要公用的任何其他服务。工作正常,我不认为它是一个破解。

在创建使用SCB的线程池之前,我创建了SCB(并确保在ctor中通过它访问的所有服务都已启动并可以使用) - 没有讨厌的单例东西。

Rgds, Martin Martin

+0

好听起来不错 - 我会继续在我的线程池中使用“this”。 –

1

单独的线程类是非常正常的,特别是如果他们有特定的功能。我不会从主线程继承。

+0

是的我猜我的主要问题是将“this”指针传递给线程类错误编码或者它是相当标准的。这感觉就像是一个黑客 –

+0

这是不是一个黑客,如果你把主类作为单身人士等 –

+0

传递“这个”指针是正常的,这是一个常见的事情要做。正如Aditya所说,你也可以让你的主类成为单例,所以你不会传递任何指针,只要你想要访问方法就调用MainClass :: getInst() - >。 –

1

薪火this指针线程不,本身不好。你用它做什么可以。

this指针就像任何其他POD肥胖型的数据类型。这只是一小块。然而,在this中的内容可能比POD更多,而传递实际上指向其成员的指针对于所有通常的原因可能是危险的。任何时候你在线程之间共享任何东西,都会引发潜在的竞争条件和死锁。当然,解决这些冲突的基本手段是以互斥体,信号量等形式引入同步,但这可能会带来序列化应用程序的惊喜效果。

说您从一个插座具有一个线程读取数据并将其存储到同步命令缓冲区,而另一个线程从该命令缓冲区读取。两个线程都使用相同的互斥锁来保护缓冲区。一切都很好,对吗?

好吧,也许不是。如果你不太关心你如何锁定缓冲区,你的线程可能会被序列化。假设您为缓冲区插入和缓冲区移除代码创建了单独的线程,以便它们可以并行运行。但是,如果您每次删除每个插入的锁定缓冲区,则一次只能执行其中一个操作。只要你写入缓冲区,你就不能读取它,反之亦然。

您可以尝试微调的锁,让他们尽可能简短,但只要你有共享,同步数据,你将有一定程度的系列化。

另一种方法是一手数据给另一个线程明确,并删除尽可能多的数据共享成为可能。例如,您的套接字代码可能会在堆上创建某种Command对象(例如Command* cmd = new Command(...);),并将该对象传递给另一个线程,而不是像上面那样写入缓冲区并从缓冲区读取数据。 (在Windows中执行此操作的一种方法是通过QueueUserAPC机制)。

有优点缺点&这两种方法。同步方法具有在表面理解和实现起来更简单的好处,但是如果你搞砸了,则更难以调试的潜在缺陷。切换方法可能使同步中固有的许多问题变得不可能(从而实际上使其更容易),但是在堆上分配内存需要时间。