POSIX 具有未命名(基于記憶體)信號量的概念。這些在某個記憶體位置用 初始化sem_init,然后我們可以用sem_post和使用它們sem_wait。我想知道是否可以將“信號量句柄”復制到其他記憶體位置,然后將其用作正常、獨立、初始化良好的信號量。
換句話說,這樣做是否合法:
#include "semaphore.h"
int main()
{
sem_t s1;
sem_init(&s1, 0, 1); /* Initialize unnamed semaphore */
sem_t s2 = s1; /* Copy to some other memory location */
sem_wait(&s2); /* Lock on the semaphore */
sem_post(&s2); /* Release the lock */
return 0;
}
這似乎在 Linux 上作業得很好,沒有問題。在 glibc 中,信號量似乎只是 2 或 3 個整數,使用原子指令來確保它是執行緒(甚至行程)安全的:https ://github.com/bminor/glibc/blob/ 6c2f050dbe11fb4ed0a401a5f25731f2aa53046b/htl/pt-internal.h#L333所以,如果我復制信號量,它只會復制它的當前狀態(它的值),這很好。
但是,我想知道這是否只是偶然的,我們不能將這種行為依賴于其他 POSIX 實作。
例如,我發現在 FreeRTOS POSIX 層(https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_POSIX/index.html),這是無效的,因為它的信號量是在 FreeRTOS 信號量之上實作的,并且FreeRTOS 內核跟蹤初始化信號量的地址。因此,不可能只是盲目地將信號量句柄復制到不同的記憶體位置然后使用它。當然,請注意,FreeRTOS POSIX 庫并未聲稱與 POSIX 兼容,它僅實作了 POSIX API 的一小部分,因此這只是一個示例。
我在官方 POSIX 檔案中找不到任何提及此行為的內容。
uj5u.com熱心網友回復:
POSIX 規范提到:
對于屏障、條件變數、互斥體和讀寫鎖,如果行程共享屬性設定為 PTHREAD_PROCESS_PRIVATE,則只有用于初始化它的地址處的同步物件才能用于執行同步。在鎖定、解鎖或銷毀物件時參考同一物件的另一個映射的效果是 undefined。如果 process-shared 屬性設定為 PTHREAD_PROCESS_SHARED,則只能使用同步物件本身進行同步;但是,它不需要在用于初始化它的地址處被參考(也就是說,可以使用同一物件的另一個映射)。在鎖定、解鎖或銷毀物件時參考物件副本的效果是未定義的。
因此,為了符合 POSIX,不允許復制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/524593.html
上一篇:C-While回圈不應該運行兩次
下一篇:如何掃描輸入鍵作為輸入
