多程式之間的執行緒利用XSI IPC共享記憶體分配互斥量進行同步
···
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
static pthread_mutex_t *mtx;
static void *original_owner_thread(void *ptr){
printf("[original owner] Setting lock...\n");
pthread_mutex_lock(mtx);
printf("[original owner] Locked. Now exiting without unlocking.\n");
pthread_exit(NULL);//加鎖後退出不釋放鎖
}
int main(){
pid_t pid_robust;
int shmid;
//利用XSI IPC,分配互斥量的記憶體
shmid = shmget(IPC_PRIVATE,sizeof(pthread_mutex_t),IPC_CREAT|IPC_EXCL);
//獲取記憶體區指標
mtx=shmat(shmid,0,0);
pid_robust = fork();
int proc_status;
int ret;
if(pid_robust <0 ){
printf("[main process] fork error!\n");
return -1;
}
if (pid_robust > 0){
pthread_t thr_p;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_setpshared(&attr,PTHREAD_PROCESS_SHARED);
pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST);
pthread_mutex_init(mtx, &attr);
pthread_create(&thr_p, NULL, original_owner_thread, NULL);
}else if(0==pid_robust){
int err_code;
sleep(2);
printf("[fork main thread] Attempting to lock the robust mutex.\n");
err_code = pthread_mutex_lock(mtx);
if (err_code == EOWNERDEAD) {
printf("[fork main thread] pthread_mutex_lock() returned EOWNERDEAD\n");
printf("[fork main thread] Now make the mutex consistent\n");
err_code = pthread_mutex_consistent(mtx);//呼叫函式進行更換鎖的屬主,也就是鎖從以前擁有者更換為當起執行緒
if (err_code != 0){
handle_error_en(err_code, "pthread_mutex_consistent");
}
printf("[fork main thread] Mutex is now consistent; unlocking\n");
err_code = pthread_mutex_unlock(mtx);
if (err_code == 0 ){
printf("[fork main thread] pthread_mutex_lock() unexpectedly succeeded\n");
}else{
handle_error_en(err_code, "pthread_mutex_unlock");
}
}else{
printf("[fork main thread] lock success! %d\n",err_code);
}
exit(0);
}
printf("parent main thread waiting fork process \n");
sleep(2);
if(waitpid(pid_robust,&proc_status,0) < 0){
printf("[parent main thread] waiting for fork process error.\n");
return 127;
}
if(WIFEXITED(proc_status)){
return 0;
}
return 127;
}
···
編譯:
gcc -lpthread -o muti_proc_thread_lock muti_proc_thread_lock.c
結果:
參考:
https://baijiahao.baidu.com/s?id=1639746835739880284&wfr=spider&for=pc
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30221425/viewspace-2653774/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- windows多執行緒同步--互斥量Windows執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- 在共享記憶體中進行執行緒間的同步是確保多執行緒程式正確執行的關鍵,以下是幾種常見的方法記憶體執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- 1、多執行緒同步——CPU、core核、執行緒、記憶體執行緒記憶體
- windows多執行緒同步互斥--總結Windows執行緒
- python多執行緒程式設計3: 使用互斥鎖同步執行緒Python執行緒程式設計
- Java多執行緒之記憶體模型Java執行緒記憶體模型
- 執行緒同步與互斥:互斥鎖執行緒
- Java併發程式設計,互斥同步和執行緒之間的協作Java程式設計執行緒
- 【C/C++多執行緒程式設計之六】pthread互斥量C++執行緒程式設計thread
- 多執行緒之共享模型執行緒模型
- 多執行緒之Java記憶體模型(JMM)(一)執行緒Java記憶體模型
- Java多執行緒記憶體模型Java執行緒記憶體模型
- Python 執行緒同步與互斥Python執行緒
- 畫江湖之 PHP 多執行緒開發 【執行緒安全 互斥鎖】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [執行緒安全 互斥鎖]PHP執行緒
- 多執行緒和多執行緒同步執行緒
- c++實現程式與執行緒的同步互斥C++執行緒
- 【C++11多執行緒入門教程】系列之互斥量mutexC++執行緒Mutex
- windows多執行緒同步--訊號量Windows執行緒
- 多執行緒下的程式同步(執行緒同步問題總結篇)執行緒
- 執行緒同步(windows平臺):互斥物件執行緒Windows物件
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- 多執行緒同步執行緒
- 共享記憶體對映(linux程式與執行緒學習筆記)記憶體Linux執行緒筆記
- linux多執行緒-----同步機制(互斥量、讀寫鎖、條件變數)Linux執行緒變數
- 多執行緒之間通訊及執行緒池執行緒
- 記憶體池、程式池、執行緒池記憶體執行緒
- 理解c#的多執行緒的時間片分配C#執行緒
- iOS多執行緒程式設計:執行緒同步總結iOS執行緒程式設計
- .NET多執行緒程式設計(3):執行緒同步 (轉)執行緒程式設計
- iOS多執行緒非同步訊號量iOS執行緒非同步
- 多執行緒之間的通訊執行緒
- 多執行緒之間的競爭執行緒
- openharmony 多執行緒的方式有哪些?兩個worker執行緒資料如何通訊、記憶體如何共享、與Java多執行緒有什麼區別?執行緒記憶體Java
- 程式間通訊——XSI IPC之訊息佇列佇列
- Linux之執行緒互斥鎖Linux執行緒