程序間通訊有一種[共享記憶體]方式,大家有沒有想過,這種通訊方式中如何解決資料競爭問題?我們可能自然而然的就會想到用鎖。但我們平時使用的鎖都是用於解決執行緒間資料競爭問題,貌似沒有看到過它用在程序中,那怎麼辦?
關於程序間的通訊方式估計大多數人都知道,這也是常見的面試八股文之一。
關於程序間通訊方式和優缺點我之前在【這篇文章】中有過介紹,感興趣的可以移步去看哈。
程序間通訊有一種[共享記憶體]方式,大家有沒有想過,這種通訊方式中如何解決資料競爭問題?
我們可能自然而然的就會想到用鎖。但我們平時使用的鎖都是用於解決執行緒間資料競爭問題,貌似沒有看到過它用在程序中,那怎麼辦?
我找到了兩種方法,訊號量和互斥鎖。
#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);具體含義大家應該看名字就知道,這裡的重點就是sem_init中的pshared引數,該引數為1表示可在程序間共享,為0表示只在程序內部共享。int sem_post(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_destroy(sem_t *sem);
第二種方式是使用鎖,即pthread_mutex_t,可是pthread_mutex不是用作執行緒間資料競爭的嗎,怎麼能用在程序間呢?
我也是最近才知道,可以給它配置乙個屬性,示例**如下:
pthread_mutex_t* mutex;它的預設屬性是程序內私有,但是如果給它配置成pthread_process_shared,它就可以用在程序間通訊中。pthread_mutexattr_t mutexattr;
pthread_mutexattr_init(&mutexattr);
pthread_mutexattr_setpshared(&mutexattr, pthread_process_shared);
pthread_mutex_init(mutex, &mutexattr);
完整**如下:
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 ...