Pthread.

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

第1单元 操作系统概论 第一节 绪论 操作系统定义.
行程(process).
Memory Pool ACM Yanqing Peng.
第一章 C语言概述 计算机公共教学部.
操作系统原理 Principles of Operating System
C語言中可變参數的用法——va_list、va_start、va_arg、va_end参數定義
C语言程序设计 第十二章 位运算.
高级语言程序设计 主讲人:陈玉华.
Do.For.While.正三角.倒正三角.倒九九乘法表
函數 授課:ANT 日期:2009/3/24.
選擇排序法 通訊一甲 B 楊穎穆.
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
chapter 1-Introduction
核探测与核电子学国家重点实验室 报告人:董磊 指导老师:宋克柱
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
C 程式設計— 指標.
函數 授課:ANT 日期:2011/3/28.
第7章 Linux环境编程.
助教:胡光能,解定宝 编译原理讲师:戴新宇
第四讲 MPI并行程序设计 课程网站:CourseGrading buaa.edu.cn 主讲教师: 赵长海
C語言簡介 日期 : 2018/12/2.
Function.
程序设计期末复习 黎金宁
进程及进程管理 第4章 进程及进程管理.
Chapter 7 指標.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab8 1.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab10 1.
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab9 1.
程式設計實習課(四) ----C 函數運用----
第一單元 建立java 程式.
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
Oop8 function函式.
3.5 线程 问题的提出 进程的引入使操作系统得以完成对并发执行的多道程序动态特征的描述和资源共享的管理,因而进程既是调度的基本单位又是资源分配的基本单位。进程所具有的这两个特点构成了程序并发执行的基础,但同时又导致进程切换过程中由于进程映像过大而带来的时空开销。因此,如果系统中创建的进程过多,或进程切换的频率过高,则会使系统效率下降,限制了并发度的进一步提高。
指標
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
C標準輸出入函數庫 與 作業系統.
C qsort.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
本节内容 文件读写 视频提供:昆山爱达人信息技术有限公司.
第二章 类型、对象、运算符和表达式.
本节内容 引用类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
陣列與結構.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab7.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
Introduction to the C Programming Language
第十二章 位运算.
MultiThread Introduction
作業一: 安裝Linux於btrfs上 中正大學 作業系統實驗室 指導教授:羅習五
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
Programming & Language Telling the computer what to do
Chapter 6 函數.
第6章 嵌入式软件开发基础.
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab10 1.
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab11 1.
Chapter 4 Multi-Threads (多執行緒).
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab7.
Introduction to the C Programming Language
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

pthread

先安裝程式設計師手冊 sudo apt-get install manpages-posix manpages-posix-dev

pthread_create() int pthread_create(pthread_t *tid , const pthread_attr_t *attr , void *(*function)(void *) , void *argument) tid,建立thread必備的資料結構,代表新建立的thread attr,新建立的thread的屬性,一般填入NULL function,該thread所要執行的函數的名稱 argumentt傳遞給上述函數的參數 正確回傳0,錯誤則看errno

建立一個pthread-nosync #include <stdio.h> #include <pthread.h> int global=0; void thread(void) { int i; for (i=0; i<1000000; i++) global+=1; }

建立一個pthread-nosync int main(void) { pthread_t id1, id2; pthread_create(&id1,NULL,(void *) thread,NULL); pthread_create(&id2,NULL,(void *) thread,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); printf("1000000+1000000 = %d\n", global); return (0); }

執行結果 ./nosync 1000000+1000000 = 1476992 real 0m0.007s user 0m0.008s sys 0m0.000s

結果討論 因為二個執行緒共用一個變數,而且沒有任何同步機制,這會造 成二個執行緒彼此覆寫全域變數

semaphore #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); sem:要初始化的semaphore的物件指標 pshared:0該semaphore給執行緒使用,1給行程使用 value:要將semaphore初始化成value

post and wait #include <semaphore.h> int sem_post(sem_t *sem); int sem_wait(sem_t *sem); sem_post離開全域變數存取區間 sem_wait準備進入全域變數存取區間

使用semaphore #include <stdio.h> #include <pthread.h> #include <semaphore.h> int global=0; sem_t semaphores; void thread(void) { int i; for (i=0; i<1000000; i++) { sem_wait(&semaphores); global+=1; sem_post(&semaphores); }

使用semaphore } int main(void) { pthread_t id1, id2; sem_init(&semaphores, 0, 1); pthread_create(&id1,NULL,(void *) thread,NULL); pthread_create(&id2,NULL,(void *) thread,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); printf("1000000+1000000 = %d\n", global); return (0);

執行結果 ./semaphore 1000000+1000000 = 2000000 real 0m0.228s user 0m0.268s sys 0m0.184s

結果討論 semaphore是功能強大的同步函數,他的初始值可以是任何整數, 通常semaphore的初始值N代表最多可以有N個執行緒修改全域 變數

mutex #include <pthread.h> int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr) int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); attr:設定這個mutex的屬性,使用預設屬性則傳入NULL

使用mutex #include <stdio.h> #include <pthread.h> #include <semaphore.h> int global=0; pthread_mutex_t mutex; void thread(void) { int i; for (i=0; i<1000000; i++) { pthread_mutex_lock(&mutex); global+=1; pthread_mutex_unlock(&mutex);

使用mutex } int main(void) { pthread_t id1, id2; pthread_mutex_init(&mutex, NULL); pthread_create(&id1,NULL,(void *) thread,NULL); pthread_create(&id2,NULL,(void *) thread,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); printf("1000000+1000000 = %d\n", global); return (0);

執行結果 ./mutex 1000000+1000000 = 2000000 real 0m0.148s user 0m0.192s sys 0m0.096s

結果討論 mutex的值只能是1, 0,這意味著最多只有一個thread能進入全域 變數存取區間

複習「關鍵字」「volatile」 在GNU C當中如果一個變數宣告為volatile,那麼這個變數「一定」 會配置在主記憶體。

使用volatile(錯誤的程式) #include <stdio.h> #include <pthread.h> #include <semaphore.h> volatile int global=0; void thread(void) { int i; for (i=0; i<1000000; i++) global+=1;

使用volatile(錯誤的程式) } int main(void) { pthread_t id1, id2; pthread_create(&id1,NULL,(void *) thread,NULL); pthread_create(&id2,NULL,(void *) thread,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); printf("1000000+1000000 = %d", global); return (0);

執行結果 ./volatile 1000000+1000000 = 2000000 real 0m0.006s user 0m0.004s sys 0m0.000s

使用volatile(錯誤的程式) #include <stdio.h> #include <pthread.h> #include <semaphore.h> volatile int global=0; void thread(void) { int i; for (i=0; i<1000000; i++) global+=2;

結果 ./volatile 1000000+1000000 = 2337650 real 0m0.009s user 0m0.012s sys 0m0.000s

2job #include <stdio.h> #include <pthread.h> #include <semaphore.h> volatile int global=0; pthread_mutex_t mutex; void thread(void) { int local=0; int i; for (i=0; i<1000000; i++) local+=1; pthread_mutex_lock(&mutex);

2job global+=local; pthread_mutex_unlock(&mutex); } int main(void) { pthread_t id1, id2; pthread_mutex_init(&mutex, NULL); pthread_create(&id1,NULL,(void *) thread,NULL); pthread_create(&id2,NULL,(void *) thread,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); printf("1000000+1000000 = %d", global); return (0);

執行結果 ./2job 1000000+1000000 = 2000000 real 0m0.005s user 0m0.004s sys 0m0.000s

執行結果2 ./2job 1000000000+1000000000 = 2000000000 real 0m2.192s user 0m4.368s sys 0m0.004s

結果討論 同步機制用越少通常效果越好,盡量的找出可以平行處理,又不 需要同步機制的方法。

base #include <stdio.h> int global=0; int main(int argc, char **argv) { int i; for (i=0; i<2000000; i++) { global+=1; } printf("1000000+1000000 = %d\n", global); return 0;

執行結果 ./base 1000000+1000000 = 2000000 real 0m0.005s user 0m0.004s sys 0m0.000s

結果比較 base nosync (錯誤) semaphore mutex volatile 平台相依 2job real .005 .007 .228 .148 .006 user .004 .008 .268 .192 sys .000 .184 .096