2013-10-03 21 views
1

我需要保護資源不被中斷,在這種情況下寫入套接字。我有一個類TelnetServer,它被多次實例化(每次使用一次連接)。QMutex - 保護線程內但不跨線程

我想防止寫入單個用戶被另一個寫入同一用戶(即鎖定互斥鎖寫入該同一個套接字)中斷。但是,當我寫入單個用戶時,我不想凍結所有寫入所有套接字的所有寫入。爲了澄清(僞C++):

Class TelnetThread { 
    QMutex mutex; 

    void writeToSocket() { 
     mutex.lock(); 
     socket->write(string); 
     mutex.unlock(); 
    } 
} 

所以,如果我有30 TelnetThread的運行,寫一個插座不應阻止同時寫入到另一個線程。但是,如果有幾個插槽觸發寫入同一個套接字/線程,那麼它們應該被序列化。

我應該在哪裏聲明我的互斥變量?如果我把它變成一個類(線程)變量,是不是將所有線程中的所有套接字寫入(這個類的所有實例)序列化?如果我使它成爲writeToSocket中的函數變量,那麼我認爲它不會將寫入操作串行化到相同的套接字。

幫助...我該怎麼做?

+0

你應該在與套接字成員相同的範圍內降低你的互斥量。 –

+1

如果你想每個插座互斥一個,每個插座配一個 –

+0

我不明白。根據我的閱讀,如果我在類級別聲明一個套接字變量,並在類級別聲明一個互斥量,那麼(該類的)所有線程共享相同的互斥量,這不是我想要的。 – TSG

回答

0

即用於寫入的互斥對象鎖定到一個插座

你可以任一寫包封插座寫入儲物櫃類型,或者僅僅治療與在同一單元內一起對應互斥。

正如我在之前的一個線程中寫到的,我會考慮在這種情況下使用QMutexLocker。它不太容易出錯,並且也使代碼更短。