執行緒機制 併發函式的使用

2021-07-23 19:53:07 字數 1416 閱讀 7564

一、背景

之前學習過程序的概念,而計算機是不可能只單單執行乙個程序的。我們使用fork與exec等系統呼叫來使程序併發執行。然而對於乙個程序而言,該程序一定是有多個函式的,那麼這些函式是否可以併發執行呢?當然是可以的,這一機制就叫做執行緒機制。

二、乙個單執行緒程式

或許大家會有疑問,為什麼前半部分輸出的helloworld很正常,到後半部分就亂了呢。

原因是thread函式是併發執行的,也可理解為函式在同時執行,所以輸出hello與輸出world的先後順序並不是一定的,

每一次的輸出結果都有可能相同也有可能不相同。

四、共享全域性變數

對比程序來學習執行緒,程序之間有程序之間的通訊方式,程序可通過管道、socket、訊號、退出/等待來進行程序間的通訊。

而執行緒之間通過什麼通訊方式來進行它們之間的分工合作呢?

我們明白,各個執行緒雖不相同,但都是同在同乙個程序中執行的,也就是說,它們之間是共享全域性變數的。通過全域性變數的使用就可以完成執行緒之間的通訊。

執行緒之間可通過全域性變數進行合作。這裡舉乙個例子:

#include

#include

#include

#define num 5

int counter = 0;

int main()

{pthread_t t1;

void *print_count(void *);

int i;

pthread_create(&t1,null,print_count,null);

for(i=0;i初始執行緒每一秒對counter進行加1操作,而新執行緒每一秒對counter進行一次列印操作。

這樣,我們看一下輸出結果:

我們可以看到,兩次輸出有不一樣的結果,原因就在於在新執行緒對全域性變數counter進行列印時,可能初始執行緒剛剛對counter進行了加1操作,

也可能是剛列印完初始執行緒才對counter進行了加1操作。這就造成了輸出結果的不確定。

由此我們可以看到,使用全域性變數既可進行通訊,也同時是乙個危險的行為。

五、總結

本文簡單介紹了併發函式的使用,其中涉及了幾個簡單的系統呼叫。需要注意的是,併發函式使用全域性變數既方便,但也危險。本文還未涉及如何安全的對全域性變數進行訪問。待到下次分析。

併發程式設計 執行緒的使用

新建狀態 執行new以後,還沒開始執行 就緒狀態 執行了start方法以後,等待cup分配時間執行run方法 執行狀態 執行run方法以後 阻塞狀態 sleep 鎖 阻塞佇列等 死亡狀態 執行完成或報出異常 public class extendscreate extends thread publ...

併發程式設計 執行緒的使用

from threading import thread from time import sleep 執行緒的實現 方式一 用方法實現 def func1 name print f threading start sleep 3 建立執行緒 t1 thread target func1,args ...

python開發 函式的引數傳遞

在這個用例中,我們要討論的是關於函式的傳參問題 我所使用的python版本為3.3.2 對於函式 1 deffun arg 2print arg 34 defmain 5 fun hello,hongten 67if name main 8 main 當我們傳遞乙個引數給fun 函式,即可列印出傳遞...