確保在多線程環境中僅對堆棧分配的pthread_mutex_t對象進行一次初始化的建議/標準方法是什麼?如何確保共享堆棧分配pthread_mutex_t的單個初始化? (C++)
的pthread_mutex_init()
手冊頁說:
試圖初始化在 不確定的行爲已初始化互斥結果。
我有一個.cpp
文件被編譯到共享庫。此文件的簡化是:
#include <pthread.h>
static pthread_mutex_t g_mutex;
int initialize()
{
pthread_mutex_init(&g_mutex, NULL);
pthread_mutex_lock(&g_mutex);
// Do init stuff.
pthread_mutex_unlock(&g_mutex);
return 0;
}
initialize()
可以在多線程環境中調用。因此,如上所述,pthread_mutex_init()
可能會在同一個對象上被調用多次,這是未定義的行爲。所以這需要線程安全......通過使用另一個互斥體。但是,那麼誰是以線程安全的方式初始化這個互斥鎖呢?
在全球範圍內(即與pthread_mutex_t
對象聲明相同的範圍)調用pthread_mutex_init()
是否合法?是否被認爲是這種情況的「正確」解決方案?
#include <pthread.h>
static pthread_mutex_t g_mutex;
static int g_res = pthread_mutex_init(&g_mutex, NULL);
int initialize()
{
// g_mutex already initialized (?) so no need to do so here.
pthread_mutex_lock(&g_mutex);
// Do init stuff.
pthread_mutex_unlock(&g_mutex);
return 0;
}
我已經試過:
我編譯和運行第二個代碼塊,這兩者的成功。
但是我還是想問的社區,因爲我有點不清楚停靠全球範圍內pthread_mutex_init()
功能的合法性,我想,以確保執行不只是出現的,因爲不確定的工作行爲。
我也讀了關於'PTHREAD_MUTEX_INITIALIZER',但那麼提示問題_什麼,如果默認屬性不會做?_。我也很好奇,會發生什麼在C編譯器中的「解決方案」代碼?是一個編譯或運行時錯誤嗎? – StoneThrow
@StoneThrow,建議的解決方案將被符合C編譯器拒絕 –
「但它在C++中沒有問題」...所以我猜想在C++中,如果默認屬性不行,那麼靜態聲明一個'pthread_mutexattr_t'並將其作爲參數傳遞給'pthread_mutex_init()'...的全局函數是可以接受的。我很好奇這種情況在C中如何解決。也許我會問一個單獨的問題。 – StoneThrow