程序間通訊如何加鎖

2022-09-21 07:18:10 字數 3032 閱讀 1029

程序間通訊有一種[共享記憶體]方式,大家有沒有想過,這種通訊方式中如何解決資料競爭問題?我們可能自然而然的就會想到用鎖。但我們平時使用的鎖都是用於解決執行緒間資料競爭問題,貌似沒有看到過它用在程序中,那怎麼辦?

關於程序間的通訊方式估計大多數人都知道,這也是常見的面試八股文之一。

關於程序間通訊方式和優缺點我之前在【這篇文章】中有過介紹,感興趣的可以移步去看哈。

程序間通訊有一種[共享記憶體]方式,大家有沒有想過,這種通訊方式中如何解決資料競爭問題?

我們可能自然而然的就會想到用鎖。但我們平時使用的鎖都是用於解決執行緒間資料競爭問題,貌似沒有看到過它用在程序中,那怎麼辦?

我找到了兩種方法,訊號量和互斥鎖。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

void sem()

shm_unlink(mapname);

};if (mapfd == -1)

perror("ftruncate failed \n");

exit(exit_failure);

}if (!sp)

sem_t* mutex = (sem_t*)sp;

if (sem_init(mutex, 1, 1) != 0)

meow_defer ;

int* num = (int*)((char*)sp + sizeof(sem_t));

int cid, proc_count = 0, max_proc_count = 8;

for (int i = 0; i < max_proc_count; ++i)

if (cid == 0)

close(mapfd);

exit(exit_success);

}++proc_count;

}int stat;

while (proc_count--)

}printf("ok \n");

}

int sem_init(sem_t *sem,int pshared,unsigned int value);

int sem_post(sem_t *sem);

int sem_wait(sem_t *sem);

int sem_destroy(sem_t *sem);

具體含義大家應該看名字就知道,這裡的重點就是sem_init中的pshared引數,該引數為1表示可在程序間共享,為0表示只在程序內部共享。

第二種方式是使用鎖,即pthread_mutex_t,可是pthread_mutex不是用作執行緒間資料競爭的嗎,怎麼能用在程序間呢?

我也是最近才知道,可以給它配置乙個屬性,示例**如下:

pthread_mutex_t* mutex;

pthread_mutexattr_t mutexattr;

pthread_mutexattr_init(&mutexattr);

pthread_mutexattr_setpshared(&mutexattr, pthread_process_shared);

pthread_mutex_init(mutex, &mutexattr);

它的預設屬性是程序內私有,但是如果給它配置成pthread_process_shared,它就可以用在程序間通訊中。

完整**如下:

void func() 

shm_unlink(mapname);

};if (mapfd == -1)

perror("ftruncate failed \n");

exit(exit_failure);

}if (!sp)

pthread_mutex_t* mutex = (pthread_mutex_t*)sp;

pthread_mutexattr_t mutexattr;

pthread_mutexattr_init(&mutexattr);

pthread_mutexattr_setpshared(&mutexattr, pthread_process_shared);

pthread_mutex_init(mutex, &mutexattr);

meow_defer ;

int* num = (int*)((char*)sp + sizeof(pthread_mutex_t));

int cid, proc_count = 0, max_proc_count = 8;

for (int i = 0; i < max_proc_count; ++i)

if (cid == 0)

close(mapfd);

exit(exit_success);

}++proc_count;

}int stat;

while (proc_count--)

}printf("ok \n");

}

我想這兩種方式應該可以滿足我們日常開發過程中的大多數需求。

鎖的方式介紹完之後,可能很多朋友自然就會想到原子變數,這塊我也搜尋了一下。但是也不太確定c++標準中的atomic是否在程序間通訊中有作用,不過看樣子boost中的atomic是可以用在程序間通訊中的。

其實在研究這個問題的過程中,還找到了一些很多解決辦法,包括:

disabling interrupts

lock variables

strict alternation

peterson's solution

the tsl instruction

sleep and wakeup

semaphores

mutexes

monitors

message passing

barriers

這裡就不過多介紹啦,大家感興趣的可以自行查閱資料哈。

程序間通訊(IPC) 程序加鎖解鎖

本是對 source insight 工具開啟的系統呼叫所涉及函式的截圖,過大,建議使用 在 在新標籤頁中開啟 對上面兩張圖的分析 analysis 上圖中的緩衝區 or 訊息傳送佇列,程序間通訊可能用到,也可能用不到 對sys printx函式的分析 analysis 以下有5副,第一幅是重中之重...

如何實現程序間通訊

使用共享記憶體 物理記憶體 的步驟 1 建立共享記憶體 2 對映到虛擬位址空間 3 把資料寫到共享記憶體 4 解除對映並銷毀 為避免同一時間多個程序訪問同一記憶體,我們必須給共享記憶體加鎖,實現程序同步。加鎖過程 1 建立訊號量 2 初始化訊號量 3 進行p操作 拔鑰匙 和v操作 插鑰匙 4 程式執...

程序間通訊是什麼?如何實現程序間的通訊

include intpipe fd 2 匿名管道 include include include include intmain int id fork 建立程序 if id 0 父程序 buf s 0 將讀到的最後乙個字元的後乙個字元設定為 0,方便列印 printf s n buf else ...