POSIX多執行緒 非同步程式設計舉例

2021-06-09 04:42:53 字數 3391 閱讀 1719

(整半年沒有更新,發幾篇以前的讀書筆記。)

content

0. 序

1. 基本的同步版本

2. 多程序版本

3.多執行緒版本

4. 小結

0. 序

本節通過乙個簡單的鬧鐘例項演示非同步程式設計方法。

該程式迴圈接受使用者輸入資訊,直到出錯或者輸入完畢。使用者輸入的每行資訊有兩部分:鬧鐘等待的時間(秒

)和鬧鐘時間到達時顯示的文字資訊。

1. 基本的同步版本

**如下。

/*

* alarm.c

* * ****** synchronous alarm program. this is used as a

* reference for progressive examples of asynchronous

* alarm programs.

*/#include "errors.h"

int main (int argc, char **argv)

else

}}

特點:同步實現非同步,鬧鐘請求後,程式睡眠等待鬧鐘時間到;

問題:用同步方式來實現非同步,致一次只能處理乙個鬧鐘請求;即程式睡眠時間到後才能進行下一次鬧鐘請求;

執行結果。

# ./alarm

alarm> 5

bad command

alarm> 5 this is a test with 5 seconds

(5) this is a test with 5 seconds //等待5秒並列印該訊息

alarm> 10 the seconds with 10 seconds

(10) the seconds with 10 seconds //等待10秒並列印該訊息

alarm>

2.

多程序版本

**如下。

/*

* alarm_fork.c

* * this version of alarm.c uses fork to create a new process to

* wait for each alarm to expire.

*/#include #include #include "errors.h"

int main(int argc, char **argv)

else

else

while (pid != (pid_t)0);}}

}}

特點

:在子程序中非同步地呼叫

sleep

函式,而父程序繼續執行;

問題:對每次鬧鐘請求,使用

fork

建立子程序,程式開銷過大;

waitpid()

函式執行結果。

alarm> 3 test 1                        //輸入命令

alarm> 5 test 2 //輸入命令

alarm> (3) test 1 //等待3秒並列印該訊息

10 test 3 //輸入命令

alarm> (5) test 2 //等待5秒並列印該訊息

alarm> (10) test 3 //等待10秒並列印該訊息

alarm>

# ./alarm_fork

alarm> 5 test 1

line = 56, pid = 7901

line = 58, pid = 0

alarm> 10 test 2

line = 56, pid = 7902

line = 58, pid = 0

alarm> pid = 0, (5) test 1

pid = 0, (10) test 2

alarm> 15 test 3

line = 56, pid = 7904

line = 58, pid = 7901

line = 56, pid = 7901

line = 58, pid = 7902

line = 56, pid = 7902

line = 58, pid = 0

alarm> pid = 0, (15) test 3

alarm>

3.

多執行緒版本

**如下。

/*

* alarm_fork.c

* * this version of alarm.c uses pthread_create to create a

* separate thread to wait for each alarm to expire.

*/#include #include "errors.h"

typedef struct alarm_tag alarm_t;

void *alarm_thread (void *arg)

int main (int argc, char *argv)

else

}}

特點

:在該例子中,

alarm

執行緒呼叫

pthread_detach()

函式來分離自己,通知

pthreads

不必關心它的終止時間和退出狀態;因此不需要等待執行緒結束,除非希望獲得它的返回值。

alarm

執行緒的資源在它終止後立即**。

一般地,

pthreads

會儲存執行緒的資源以使其他執行緒了解它已經終止並獲得其最終結果。在本例中,

alarm

執行緒負責自己分離自己。

該版本用到以下函式:

執行結果。

# ./alarm_thread

alarm> 5 atest

alarm> 10 btest

alarm> (5) atest

alarm> 15 ctest

alarm> (10) btest

(15) ctest

alarm>

4.

小結多程序版本

多執行緒版本

多執行緒程式設計優點

多執行緒程式設計缺點

何種應用適合使用多執行緒?

reference

# man waitpid

# man pthread_create

# man pthread_detach

非同步程式設計(或多執行緒程式設計)

程序是一種正在執行的程式。執行緒是程式中的乙個執行流。多執行緒是指乙個程式中可以同時執行多個不同的執行緒來執行不同的任務。thread是建立和控制線程的類。managedthreadid是執行緒id。currentthread是獲取當前正在執行的執行緒。同步是呼叫一旦開始,呼叫者必須等到方法呼叫返回...

POSIX執行緒多執行緒例子

include include include include define num threads 6 void thread function void arg int main sleep 1 printf waiting for threads to finish.n for lots of...

C 非同步程式設計與多執行緒程式設計

c 5.0推出了非同步程式設計,通過關鍵字async 和 await及返回型別為task 無返回值的非同步方法 和task 返回值為t的非同步方法 可以將方法封裝為非同步方法。呼叫非同步方法時,遇到await關鍵字程式會立即返回到呼叫者,直到await後的方法執行完成。包括兩種非同步方式 i o繫結...