2012-06-15 50 views
5

我正在研究一個多線程程序,並且有一個關於在哪裏定義互斥量的問題。C在哪裏定義一個多線程程序中的互斥量?

相關信息:該程序有main.c根據用戶輸入確定特定操作。主要調用位於名爲master.c的文件中的master_function。在master.c文件中,我們沿着一些其他操作(不相關)創建了N個線程。這些線程調用名爲son_threads的函數,該函數位於son.c文件中,並且他們在進入臨界區域時需要使用互斥體(編輯多個全局變量以防止競爭條件)。另一個文件是type.h,我定義了幾個我需要使用的全局變量。

互斥的聲明是:

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 

於是,我就在我的type.h所以它的son.c文件可見來定義互斥。當我嘗試編譯時,它給我錯誤。這是正確的,因爲我在多個文件中定義了該互斥鎖。

但我確定我不能在son.c文件中定義互斥體,因爲每次創建該線程時,互斥體都將初始化爲默認設置,不允許我正確使用它。不確定這一點。

互斥量必須是一個全局變量,其中N個線程可以訪問它。那麼我應該把它放在哪裏?

我不知道我是否正確地解釋自己。盡我所能。

回答

6

只是聲明你的變量在.h文件

extern pthread_mutex_t mutex1; 

,並保持定義在C文件初始化。這正如C標準所表示的那樣。

對於POSIX,靜態存儲互斥體的初始化非常重要。因此該定義不能存在於.h文件中。

1

如果你必須有一個全局變量並在'C'模塊之間共享它,我認爲在include文件中聲明它是很典型的。在過去,我們會在.h文件中使用一些像「GLOBAL」這樣的魔術宏作爲「extern」,並且在主體中我們會將GLOBAL重新定義爲「無」,這樣它就會在main中聲明。

#ifndef _TYPES_H 
#define _TYPES_H 

    // types.h 

    #ifndef GLOBAL 
    # define GLOBAL extern 
    #endif 

    GLOBAL my_global mutex; 


#endif 
+0

好吧,我明白你的意思。讓我看看它是如何運作的。感謝您的建議! – Alessandroempire

+0

在這裏,我不認爲帶有'GLOBAL'的遊戲有很大的作用。您需要'.h'文件中的聲明和'.c'中的初始化*中的定義*。 'pthread_mutex_t'的默認初始化不會。 –

+0

@JensGustedt這就是我剛剛做的,它的工作。我沒有注意到我正在初始化.h文件中的互斥體。巨大的錯誤。 – Alessandroempire

2

但我敢肯定,我不能確定在son.c文件互斥,因爲每一個我創建一個線程時,互斥量將被初始化爲它的默認設置,而不是讓我正確地使用它。不確定這一點。

這是不正確的。將該互斥體定義放入該文件中,但不在線程函數中。它將在程序啓動時初始化,但不會在每個新線程中初始化。您可以將extern pthread_mutex_t mutex1;放在其中一個頭文件中,以便任何不在son.c中的互斥用戶知道互斥。

+0

這是我的懷疑!我想每次我創建一個新的線程,它只會重置互斥量那麼這是個好消息。非常感謝! – Alessandroempire