簡單多執行緒程式設計中的切換問題(os hw4)

2022-05-29 20:33:15 字數 1403 閱讀 8747

寫乙個 2 執行緒的程式:

首先生成乙個從 1 到 1000 萬的整數陣列,然後用兩個執行緒分別計算陣列奇數部分和偶數部分的和,並列印出總的和。(採用 pthread api )

#include #include #include #include #include #include #include #include #define n 10000000

#define step 2

long int integer[n];

void *sumf(void *t)

printf(": %ld\t", s);

}int main()

編譯執行的結果:

$ gcc hw4.c -lm -o3 -g -o hw4 -lpthread # 在最後鏈結pthread的動態庫

$ ./hw4

sample: odd sum: 25000000000000 even sum: 25000005000000

2 threads:

odd sumeven sum: 25000000000000 : 25000005000000

(glibc) time used:0.4862ms

可以發現最後輸出格式略奇怪,檢查 sumf 函式,發現它的結構大致為:if-calc()-prtf(res),由於 pthread_create 產生的執行緒可能在執行中隨機切換(即執行緒內有序,執行緒間隨機),因此有可能執行完 th1 的 if 段後切換到 th2 執行,從而使輸入格式不符合預期(在程式上並沒有毛病)。

為了改善這種情況,注意到 printf 提供的是封裝的核心態函式的使用者態介面,因此考慮把 if 的 print 和 res 的print合併使用 printf,新的 sumf 如下:

void *sumf(void *t)

// 合併輸出想要的結果

if (integer[ini] % step)

printf("odd sum: %ld\t", s);

else

printf("even sum: %ld\t", s);

}

得到的結果即修正為:

$ gcc hw4.c -lm -o3 -g -o hw4 -lpthread

$ ./hw4

sample: odd sum: 25000000000000 even sum: 25000005000000

2 threads:

odd sum: 25000000000000 even sum: 25000005000000

(glibc) time used:0.4958ms

該修改的效用得到驗證。

簡單的Linux多執行緒程式設計

最近在實習的公司做乙個ros系統,有個部分需要控制電機,以及分析電機碼盤給上來的資料,用的是串列埠通訊。由於碼盤給上來的資料時間是不固定的,下放命令的時間也是不固定的,所以只能做成非同步通訊的形式。所以就需要用到多執行緒程式設計了。程式語言是c,但由於另乙個部分是企業提供的,c 形式,用到了很多類,...

簡單的 java 多執行緒程式設計練習。

啟動 3個執行緒列印遞增的數字 執行緒 1先列印 1,2,3,4,5,然後是執行緒2列印 6,7,8,9,10,然後是執行緒3列印 11,12,13,14,15.接著再由執行緒1列印 16,17,18,19,20.以此類推 直到列印到 75.程式的輸出結果應該為 執行緒1 1 執行緒 1 2 執行緒...

C 多執行緒程式設計簡單例項

using system using system.collections using system.collections.generic using system.threading 在開發中經常會遇到執行緒的例子,如果某個後台操作比較費時間,我們就可以啟動乙個執行緒去執行那個費時的操作,同時程...