我需要有一個類,每個活動在其自己的線程中每5秒執行一次。它是一個Web服務,所以它需要指定一個端點。在對象運行期間,主線程可以更改端點。這是我的課程:進程間對象傳遞
class Worker
{
public:
void setEndpoint(const std::string& endpoint);
private:
void activity (void);
mutex endpoint_mutex;
volatile std::auto_ptr<std::string> newEndpoint;
WebServiceClient client;
}
是否需要將newEndpoint對象聲明爲volatile?我肯定會這樣做,如果閱讀是在一些循環(使編譯器不優化它),但在這裏我不知道。
在每次運行中,activity()
函數都會檢查新端點(如果有新端點,則將其傳遞給客戶端並執行一些重新連接步驟)並執行其工作。
void Worker::activity(void)
{
endpoint_mutex.lock(); //don't consider exceptions
std::auto_ptr<std::string>& ep = const_cast<std::auto_ptr<string> >(newEndpoint);
if (NULL != ep.get())
{
client.setEndpoint(*ep);
ep.reset(NULL);
endpoint_mutex.unlock();
client.doReconnectionStuff();
client.doReconnectionStuff2();
}
else
{
endpoint_mutex.unlock();
}
client.doSomeStuff();
client.doAnotherStuff();
.....
}
我鎖定互斥的,這意味着所述newEndpoint對象不能再改變,所以我刪除揮發性類規範,以便能夠調用常量方法。
的對setEndpoint方法(從另一個線程調用):
void Worker::setEndpoint(const std::string& endpoint)
{
endpoint_mutex.lock(); //again - don't consider exceptions
std::auto_ptr<std::string>& ep = const_cast<std::auto_ptr<string> >(newEndpoint);
ep.reset(new std::string(endpoint);
endpoint_mutex.unlock();
}
是這件事情的線程安全嗎?如果不是,問題是什麼?我是否需要newEndpoint對象是易變的?