C 多執行緒分析

2021-08-03 18:45:41 字數 2618 閱讀 2058

以一道多執行緒面試題引入:

編寫乙個程式,開啟

3個執行緒,

執行緒的id

分別為a、b

、c,每個執行緒將自己的

id在螢幕上列印

5遍,要求輸出結果必須按

abc的順序顯示;如:

abcabc….

依次遞推!

首先簡化該多執行緒問題,即列印函式要求是aaaaabbbbbccccc。接著

分析多執行緒搶占的資源是什麼?即列印函式。

最簡單的方案用臨界區保護「列印函式」,如下(臨界區是指一塊記憶體,乙個資料結構,乙個檔案,或者任何其他具有"使用之排他性",它不會保護乙個完全沒有競爭性的**塊)

#include #include #include #define thread_num 3

using namespace std;

critical_section gcriticalsection;//臨界區

unsigned int __stdcall threada(void* pm)

while (1)

/*waitforsingleobject(hmutex[left],infinite);*/

cout<<"philosopher"if (wait_object_0 == waitforsingleobject(hmutex[right],infinite))

/*waitforsingleobject(hmutex[right],infinite);*/

cout<<"philosopher"releasemutex(hmutex[left]);

cout<<"philosopher"cout<<"philosopher"<}

return 0;

}int main()

int number = 0;

handle[number++] = (handle)_beginthreadex(null, 0, eatthink, "a",0, null); 

handle[number++] = (handle)_beginthreadex(null, 0, eatthink, "b", 0, null);

handle[number++] = (handle)_beginthreadex(null, 0, eatthink, "c", 0, null); 

handle[number++] = (handle)_beginthreadex(null, 0, eatthink, "d", 0, null); 

handle[number++] = (handle)_beginthreadex(null, 0, eatthink, "e", 0, null); 

handle[number] = (handle)_beginthreadex(null, 0, eatthink, "f", 0, null); 

waitformultipleobjects(number, handle, true, infinite);  

for (int i = 0; i < number; i++)  

return 0;  

}針對開頭的多執行緒面試題,採用臨界區或者mutex都會造成乙個問題,無法預知誰先取得cpu的使用權,只能保證,每一次只有乙個執行緒能訪問列印函式。

當然也可以採用程式方式設定標誌位等實現,但是有乙個方法可以實現執行緒之間的順序,就是訊號量,它可以解決各種producer/consumer問題的關鍵要素。

#include "stdafx.h"  

#include "stdio.h"  

#include "stdlib.h"  

#include <

iostream

>

#include <

string

>

#include <

stack

>

#include <

windows.h

>

#include <

process.h

>

using namespace std;  

const int thread_num

= 10

;  handle            ga,gb,gc;  

unsigned int __stdcall funa(void *ppm)  

unsigned int __stdcall funb(void *ppm)  

unsigned int __stdcall func(void *ppm)  

int main()  

waitformultipleobjects(thread_num, handle, true, infinite);  

//銷毀訊號量  

closehandle(ga);  

closehandle(gb);  

closehandle(gc);  

for (i= 0

; i 

<

thread_num

; i++)  

closehandle(handle[i]);  

return 0;  

}   總結:

多執行緒分析

多程序適合於完全不相干的幾件事情同時做。因為除了 段相同之外,別的都是互不相干的,而多執行緒則可以 所謂多執行緒 執行緒是可執行 的可分派單元。這個名稱 於 執行的線索 的概念。在基於執行緒的多工的環境中,所有程序有至少乙個執行緒,但是它們可以具有多個任務。這意味著單個程式可以併發執行兩個或者多個任...

cuda之多執行緒分析

cuda的執行緒是多維的,啟動乙個執行緒格,執行緒格可以是多維的,執行緒格中分為執行緒塊,執行緒塊也可以是多維的,執行緒塊中包含執行緒,對於gpu來說,同時啟動200萬個執行緒是很輕易的事情。blockidx 當前執行裝置 的執行緒塊的索引 dim3 grid dim,dim 宣告乙個二維的執行緒格...

多執行緒競爭問題分析

public class mystack public synchronized string pop throws interruptedexception return list remove list size 1 問題 這段 大多數情況下執行正常,但是某些情況下會出問題。什麼時候會出現什麼問...