進程間同步

互斥量mutex

進程間也可以使用互斥鎖,來達到同步的目的。但應在pthread_mutex_init初始化之前,修改其屬性為進程間共享。mutex的屬性修改函數主要有以下幾個。

主要應用函數:

?????? pthread_mutexattr_t mattr 類型:??? ?????? 用于定義mutex鎖的【屬性】

?????? pthread_mutexattr_init函數:??????? ?????? 初始化一個mutex屬性對象

????????????? int pthread_mutexattr_init(pthread_mutexattr_t *attr);

?????? pthread_mutexattr_destroy函數: ?????? 銷毀mutex屬性對象 (而非銷毀鎖)

????????????? int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);

?????? pthread_mutexattr_setpshared函數:? 修改mutex屬性。

????????????? int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);

????????????? 參2:pshared取值:

???????????????????? 線程鎖:PTHREAD_PROCESS_PRIVATE (mutex的默認屬性即為線程鎖,進程間私有)

???????????????????? 進程鎖:PTHREAD_PROCESS_SHARED

進程間mutex示例

進程間使用mutex來實現同步:

#include <fcntl.h>
#include <pthread.h>
#include <sys/mman.h>
#include <sys/wait.h>struct mt {int num;pthread_mutex_t mutex;pthread_mutexattr_t mutexattr;
};int main(void)
{int fd, i;struct mt *mm;pid_t pid;fd = open("mt_test", O_CREAT | O_RDWR, 0777);ftruncate(fd, sizeof(*mm));mm = mmap(NULL, sizeof(*mm), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);close(fd);unlink("mt_test");//mm = mmap(NULL, sizeof(*mm), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);memset(mm, 0, sizeof(*mm));pthread_mutexattr_init(&mm->mutexattr);                                  //初始化mutex屬性對象pthread_mutexattr_setpshared(&mm->mutexattr, PTHREAD_PROCESS_SHARED);    //修改屬性為進程間共享pthread_mutex_init(&mm->mutex, &mm->mutexattr);                          //初始化一把mutex瑣
pid = fork();if (pid == 0) {for (i = 0; i < 10; i++) {pthread_mutex_lock(&mm->mutex);(mm->num)++;printf("-child----num++   %d\n", mm->num);pthread_mutex_unlock(&mm->mutex);sleep(1);}} else if (pid > 0) {for ( i = 0; i < 10; i++) {sleep(1);pthread_mutex_lock(&mm->mutex);mm->num += 2;printf("-parent---num+=2  %d\n", mm->num);pthread_mutex_unlock(&mm->mutex);}wait(NULL);}pthread_mutexattr_destroy(&mm->mutexattr);          //銷毀mutex屬性對象pthread_mutex_destroy(&mm->mutex);                //銷毀mutexmunmap(mm,sizeof(*mm));                          //釋放映射區return 0;
}        

運行結果:

ubuntu1604@ubuntu:~/wangqinghe/linux/20190821$ ./process_mutex

---------parent-------num+=2?? 2

-child-----------------num++?? 3

---------parent-------num+=2?? 5

-child-----------------num++?? 6

---------parent-------num+=2?? 8

-child-----------------num++?? 9

---------parent-------num+=2?? 11

-child-----------------num++?? 12

---------parent-------num+=2?? 14

-child-----------------num++?? 15

---------parent-------num+=2?? 17

-child-----------------num++?? 18

---------parent-------num+=2?? 20

-child-----------------num++?? 21

---------parent-------num+=2?? 23

-child-----------------num++?? 24

---------parent-------num+=2?? 26

-child-----------------num++?? 27

---------parent-------num+=2?? 29

-child-----------------num++?? 30

?

轉載于:https://www.cnblogs.com/wanghao-boke/p/11389852.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384857.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384857.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384857.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python3字符串

字符串是Python中最常用的數據類型&#xff0c;可以使用單引號或雙引號來創建字符串 創建字符串很簡單&#xff0c;為變量分配一個值即可。 val1 ‘hello world’ var2 “Runoob” Python訪問字符串的值 Python不支持單字符類型&#xff0c;單字符在Python中也是作為 一個字符…

服務器客戶端編程

server 下面通過最簡單的客戶端/服務器程序的實例來學習socket API。 server.c的作用是從客戶端讀字符&#xff0c;然后將每個字符轉換為大寫并回送給客戶端。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #incl…

Python3元組

Python的元組與列表相似&#xff0c;不同之處在于元組的元素不能修改 元組使用小括號&#xff0c;列表使用方括號 元組創建很簡單&#xff0c;只需要在括號中添加元素&#xff0c;并使用逗號隔開即可。 創建空元組 tup1 (); tup2 (1,) 元組只包含一個元素時&#xff0c;需要在…

Python3字典

字典是另一種可變容器模型&#xff0c;可存儲任意類型的對象。 字典的每個鍵值(key>value)對用冒號分隔&#xff0c;每個對之間用逗號分隔&#xff0c;整個字典包括在花括號里&#xff0c;格式如下 d {key1 : value,key2 : value2} 鍵必須是唯一&#xff0c;但值則不必。 值…

線程回收

pthread_join函數 阻塞等待線程退出&#xff0c;獲取線程退出狀態 其作用&#xff0c;對應進程中 waitpid() 函數。 int pthread_join(pthread_t thread, void **retval); 成功&#xff1a;0&#xff1b;失敗&#xff1a;錯誤號 參數&#xff1a;thread&#xff1a;線…

Python3數字

Python3數字數據類型用于存儲數值。 數據類型是不允許改變的&#xff0c;這就意味著&#xff0c;如果改變數字數據類型的值&#xff0c;將重新分配內存空間。 Python支持三種不同不同的數值類型&#xff1a; 整型&#xff08;int&#xff09;&#xff1a;通常是被稱為整型或整數…

多進程服務器

注意&#xff1a;包含了“wrap.c” 和“wrap.h”文件在上篇博客中 /*** server.c ***/ #include<stdio.h> #include<string.h> #include<netinet/in.h> #include<arpa/inet.h> #include<signal.h> #include<sys/wait.h> #include<ctype…

服務器之select

select select能監聽的文件描述符個數受限于FD_SETSIZE,一般為1024&#xff0c;單純改變進程打開的文件描述符個數并不能改變select監聽文件個數解決1024以下客戶端時使用select是很合適的&#xff0c;但如果鏈接客戶端過多&#xff0c;select采用的是輪詢模型&#xff0c;會大…

服務器之poll

poll服務器方法采用將監聽端口用數組存放起來&#xff0c;這樣就不需要輪詢的監聽整個文件描述符了 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);struct pollfd {int fd; /* 文件描述符 */short events; /* 監控的事件 */short revents; …

Mysql數據庫簡單使用(二)

Mysql導入.sql文件 進入數據庫&#xff08;要導入的數據庫&#xff09;數據庫中有要導入.sql文件名的數據庫&#xff0c;沒有則新建。source 路徑文件名souce /home/robot/csql.sql 數據庫文件.sql文件放在/home/robot目錄下 按照時間刪除數據庫數據 DELETE FROM 表名 WHERE 時…

Python3集合

集合&#xff08;set&#xff09;是一個無序的不重復元素序列。 可以使用大括號{ } 或set&#xff08;&#xff09;函數來創建集合&#xff0c;注意&#xff1a;創建一個空集合必須用set(),{ }是用來創建一個空字典的。 創建格式&#xff1a; param {value01,value02,…} set(…

Python3條件判斷

if語句&#xff1a; Python中if語句的一般形式如下&#xff1a; if condition_1:statement_block_1 elif condition_2:statement_block_2 else:statement_block_3 if語句關鍵詞&#xff1a; if – elif – else 注意&#xff1a; 每個條件后面要使用冒號:使用縮進來劃分語句塊&…

Python3循環

Python中while語句的一般形式&#xff1a; while 判斷條件: 語句 同樣需要注意冒號和縮進&#xff0c;另外在Python中沒有do…while循環 下面的實例計算1到100總和 ##calc.py n 100sum 0 counter 1 while counter < n:sum sum countercounter 1print("total from…

Python3迭代器和生成器

迭代器 迭代是Python最強大的功能之一&#xff0c;是訪問元素集合的一種方法。 迭代器是一個可以記住遍歷的位置的對象。 迭代器對象從集合的第一個元素開始訪問&#xff0c;直到所有的元素被訪問完結束&#xff0c;迭代器只能向前不會后退。 迭代器有兩個基本方法&#xff0c;…

Pythton3實例

計算1-100之和 #add.py n 0 sum 0 for n in range(0,101):sum n print(sum) 實現99乘法法則 #mul.py i 1 while i < 9:j 1while j < i:mut j*iprint("%d * %d %d"%(j,i,mut),end" ")j 1print(" ")i 1 運算結果: robotubuntu:~/wa…

Python3函數

函數是組織好的&#xff0c;可重復使用的&#xff0c;用來實現單一&#xff0c;或相關功能的代碼段。 函數能提高應用的模塊性&#xff0c;和代碼的重復使用率。 定義一個函數 可以定義一個由自己想要功能的函數&#xff0c;以下是簡單規則&#xff1a; l 函數代碼塊是以def關…

epoll函數

epoll是Linux下多路復用IO接口select/poll的增強版本&#xff0c;它能顯著提高程序在大量并發連接中只有少量活躍的情況下的系統CPU利用率&#xff0c;因為它會復用文件描述符集合來傳遞結果而不用迫使開發者每次等待事件之前都必須重新準備要被偵聽的文件描述符集合&#xff0…

epoll事件模型

事件模型 EPOLL事件有兩種模型&#xff1a; Edge Triggered (ET) 邊緣觸發只有數據到來才觸發&#xff0c;不管緩存區中是否還有數據。 Level Triggered (LT) 水平觸發只要有數據都會觸發。 思考如下步驟&#xff1a; 假定我們已經把一個用來從管道中讀取數據的文件描述符(RFD)…

epoll反應堆模型代碼

libevent函數庫核心思想 /*** epoll_loop.c ***/ #include<stdio.h> #include<sys/epoll.h> #include<sys/socket.h> #include<arpa/inet.h> #include<fcntl.h> #include<unistd.h> #include<errno.h> #include<string.h> #in…

UDP廣播

廣播是在局域網之間的一對多的通信方式&#xff0c;使用的udp協議 /*** client.c ***/ #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h>#define SERVER_PORT 8000 #define MAXLINE…