薪火this
指针线程不,本身不好。你用它做什么可以。
的this
指针就像任何其他POD肥胖型的数据类型。这只是一小块。然而,在this
中的内容可能比POD更多,而传递实际上指向其成员的指针对于所有通常的原因可能是危险的。任何时候你在线程之间共享任何东西,都会引发潜在的竞争条件和死锁。当然,解决这些冲突的基本手段是以互斥体,信号量等形式引入同步,但这可能会带来序列化应用程序的惊喜效果。
说您从一个插座具有一个线程读取数据并将其存储到同步命令缓冲区,而另一个线程从该命令缓冲区读取。两个线程都使用相同的互斥锁来保护缓冲区。一切都很好,对吗?
好吧,也许不是。如果你不太关心你如何锁定缓冲区,你的线程可能会被序列化。假设您为缓冲区插入和缓冲区移除代码创建了单独的线程,以便它们可以并行运行。但是,如果您每次删除每个插入的锁定缓冲区,则一次只能执行其中一个操作。只要你写入缓冲区,你就不能读取它,反之亦然。
您可以尝试微调的锁,让他们尽可能简短,但只要你有共享,同步数据,你将有一定程度的系列化。
另一种方法是一手数据给另一个线程明确,并删除尽可能多的数据共享成为可能。例如,您的套接字代码可能会在堆上创建某种Command
对象(例如Command* cmd = new Command(...);
),并将该对象传递给另一个线程,而不是像上面那样写入缓冲区并从缓冲区读取数据。 (在Windows中执行此操作的一种方法是通过QueueUserAPC机制)。
有优点缺点&这两种方法。同步方法具有在表面理解和实现起来更简单的好处,但是如果你搞砸了,则更难以调试的潜在缺陷。切换方法可能使同步中固有的许多问题变得不可能(从而实际上使其更容易),但是在堆上分配内存需要时间。
你能发表一些代码吗?你知道类和实例之间的区别吗?每个线程是否有一个主类实例? –
不,有一个主线程从中产生线程。线程只需要访问主成员函数和一些变量 –