Các mô hình thông thường cho một lớp singleton là một cái gì đó giống nhưhiệu quả thread-safe singleton trong C++
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
inst = new Foo(...);
return *inst;
}
Tuy nhiên, đó là sự hiểu biết của tôi rằng giải pháp này không phải là thread-safe, vì 1) constructor Foo của có thể được gọi nhiều hơn hơn một lần (có thể hoặc có thể không quan trọng) và 2) inst có thể không được xây dựng hoàn chỉnh trước khi nó được trả về một chủ đề khác.
Một giải pháp là để bọc một mutex xung quanh toàn bộ phương pháp, nhưng sau đó tôi trả tiền cho chi phí đồng bộ hóa lâu sau khi tôi thực sự cần nó. Một giải pháp thay thế là một cái gì đó giống như
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
{
pthread_mutex_lock(&mutex);
if(inst == NULL)
inst = new Foo(...);
pthread_mutex_unlock(&mutex);
}
return *inst;
}
Đây có phải là cách phù hợp để làm điều đó, hoặc có bất kỳ cạm bẫy nào mà tôi cần biết không? Ví dụ, có bất kỳ vấn đề khởi tạo tĩnh nào có thể xảy ra, tức là inst luôn được bảo đảm là NULL thì getInst đầu tiên được gọi là?
Nhưng bạn không có thời gian để tìm một ví dụ và đánh dấu một cuộc bỏ phiếu kín? Tôi mới ra ngoài vào lúc này. – bmargulies
có thể trùng lặp của http://stackoverflow.com/questions/6915/thread-safe-lazy-contruction-of-a-singleton-in-c – kennytm
@bmargulies Không, người hỏi rõ ràng là không thể bị làm phiền, vậy tại sao nên TÔI? Tôi đã quyết định từ bỏ downvoting và đóng cửa như dupes, như tôi dường như là một trong số ít phiền toái để giữ crap ra khỏi SO. Và bạn có biết, lười biếng cảm thấy tốt! –