多程式之間的執行緒利用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- 在共享記憶體中進行執行緒間的同步是確保多執行緒程式正確執行的關鍵,以下是幾種常見的方法記憶體執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- 1、多執行緒同步——CPU、core核、執行緒、記憶體執行緒記憶體
- Java多執行緒之記憶體模型Java執行緒記憶體模型
- 執行緒同步與互斥:互斥鎖執行緒
- Java併發程式設計,互斥同步和執行緒之間的協作Java程式設計執行緒
- 多執行緒之Java記憶體模型(JMM)(一)執行緒Java記憶體模型
- Java多執行緒記憶體模型Java執行緒記憶體模型
- 多執行緒之共享模型執行緒模型
- 畫江湖之 PHP 多執行緒開發 【執行緒安全 互斥鎖】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [執行緒安全 互斥鎖]PHP執行緒
- 多執行緒和多執行緒同步執行緒
- 共享記憶體對映(linux程式與執行緒學習筆記)記憶體Linux執行緒筆記
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- 程式間通訊——XSI IPC之訊息佇列佇列
- Linux之執行緒互斥鎖Linux執行緒
- 【C++11多執行緒入門教程】系列之互斥量mutexC++執行緒Mutex
- 執行緒同步(windows平臺):互斥物件執行緒Windows物件
- 併發程式設計之volatile與JMM多執行緒記憶體模型程式設計執行緒記憶體模型
- 多執行緒之間通訊及執行緒池執行緒
- 最全java多執行緒總結2--如何進行執行緒同步Java執行緒
- 多執行緒之間的通訊執行緒
- openharmony 多執行緒的方式有哪些?兩個worker執行緒資料如何通訊、記憶體如何共享、與Java多執行緒有什麼區別?執行緒記憶體Java
- Linux多執行緒的使用一:互斥鎖Linux執行緒
- go語言多執行緒入門筆記-執行緒同步Go執行緒筆記
- 執行緒的互斥鎖執行緒
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- 程式間通訊之共享記憶體記憶體
- 手撕Java多執行緒(四)執行緒之間的協作Java執行緒
- Java 執行緒記憶體模型Java執行緒記憶體模型
- Java 多執行緒共享模型之管程(上)Java執行緒模型
- java 多執行緒 –同步Java執行緒
- java 多執行緒 --同步Java執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 程式間的八種通訊方式----共享記憶體是最快的 IPC 方式記憶體
- C#多執行緒程式設計-基元執行緒同步構造C#執行緒程式設計
- C++-(25)-多執行緒-POSIX(3)-互斥量-pthread_mutexC++執行緒threadMutex