2015-09-01 109 views
3

是否可以在Linux上用C++創建系統範圍的全局變量/信號/互斥鎖?C++/Linux中的系統範圍全局變量/信號量/互斥量?

原因如下:我有一個系統,經常在不相關的數據上運行同一軟件的多個副本。通常有4個工作,每個工作都運行相同的軟件。該軟件有一個小部分,它創建一個佔用大量內存的巨大圖形;該部分之外的內存使用量適中。

有時候會發生這樣的情況:2個作業同時碰到相同的內存耗盡部分,整個系統開始交換。因此,我們希望通過在不同作業之間創建諸如臨界區互斥之類的東西來防止這種情況發生,因此一次只能分配大量內存。

如果這些是同一作業的線程,pthread鎖可以完成這項工作。

什麼是在不同的工作之間實現這種互斥的好方法?

回答

5

如果您可以讓所有進程達成共同名稱,則可以使用named semaphore

命名信號量由所述形式 /somename的名稱來標識;即由最初 斜線組成的NAME_MAX-4(即251)字符組成的最高爲 的以NULL結尾的字符串,後跟一個或多個字符,其中沒有一個是 斜線。 通過將相同的名稱傳遞給sem_open(3),兩個進程可以在同一個命名的 信號燈上運行。

0

互斥鎖(互斥)防止多個線程 從同時執行的代碼的關鍵部分在於 訪問共享數據(即,互斥被用來序列 線程的執行)。所有互斥量都必須是全局互斥的。 A 通過mutex_lock() 成功調用互斥鎖將導致另一個線程同時試圖鎖定同一互斥鎖,直到所有者線程通過mutex_unlock()的方式解鎖爲 。其他進程中的同一進程或 中的線程可以共享互斥。

互斥可以在其它過程同步相同過程或 內螺紋。如果互斥量分配在 可寫內存中並且在協作進程 (參見mmap(2))中共享並且已經爲此任務初始化,則可以使用互斥鎖來同步進程間的線程數 。

對於進程間同步,互斥量需要在這些進程之間共享的內存中調用。由於這種互斥體的內存必須動態分配,所以需要使用mutex_init()顯式初始化互斥體。對於進程間同步,除了需要在共享內存中分配的要求外,互斥鎖還必須使用PTHREAD_PROCESS_SHARED屬性,否則從其他進程訪問互斥量比創建者導致未定義行爲(請參閱:linux.die。net/man/3/pthread_mutexattr_setpshared):「process-shared屬性設置爲PTHREAD_PROCESS_SHARED,以允許任何有權訪問分配互斥量的內存的線程操作互斥量,即使互斥量分配在內存中由多個進程

+1

geez,爲什麼不提你的源碼,而y你在嗎? http://docs.oracle.com/cd/E19455-01/806-0630/6j9vkb8e2/index.html –

2

進程間互斥的共享,你可以使用文件鎖定。有了Linux,它的代碼保護臨界區一起flock打電話一樣簡單。

int fd_lock = open(LOCK_FILE, O_CREAT); 

flock(fd_lock, LOCK_EX); 

// do stuff 

flock(fd_lock, LOCK_UN); 

如果您需要POSIX兼容性,你可以使用fcntl