薪火this
指針線程不,本身不好。你用它做什麼可以。
的this
指針就像任何其他POD肥胖型的數據類型。這只是一小塊。然而,在this
中的內容可能比POD更多,而傳遞實際上指向其成員的指針對於所有通常的原因可能是危險的。任何時候你在線程之間共享任何東西,都會引發潛在的競爭條件和死鎖。當然,解決這些衝突的基本手段是以互斥體,信號量等形式引入同步,但這可能會帶來序列化應用程序的驚喜效果。
說您從一個插座具有一個線程讀取數據並將其存儲到同步命令緩衝區,而另一個線程從該命令緩衝區讀取。兩個線程都使用相同的互斥鎖來保護緩衝區。一切都很好,對嗎?
好吧,也許不是。如果你不太關心你如何鎖定緩衝區,你的線程可能會被序列化。假設您爲緩衝區插入和緩衝區移除代碼創建了單獨的線程,以便它們可以並行運行。但是,如果您每次刪除每個插入的鎖定緩衝區,則一次只能執行其中一個操作。只要你寫入緩衝區,你就不能讀取它,反之亦然。
您可以嘗試微調的鎖,讓他們儘可能簡短,但只要你有共享,同步數據,你將有一定程度的系列化。
另一種方法是一手數據給另一個線程明確,並刪除儘可能多的數據共享成爲可能。例如,您的套接字代碼可能會在堆上創建某種Command
對象(例如Command* cmd = new Command(...);
),並將該對象傳遞給另一個線程,而不是像上面那樣寫入緩衝區並從緩衝區讀取數據。 (在Windows中執行此操作的一種方法是通過QueueUserAPC機制)。
有優點缺點&這兩種方法。同步方法具有在表面理解和實現起來更簡單的好處,但是如果你搞砸了,則更難以調試的潛在缺陷。切換方法可能使同步中固有的許多問題變得不可能(從而實際上使其更容易),但是在堆上分配內存需要時間。
你能發表一些代碼嗎?你知道類和實例之間的區別嗎?每個線程是否有一個主類實例? –
不,有一個主線程從中產生線程。線程只需要訪問主成員函數和一些變量 –