以一道多執行緒面試題引入:
編寫乙個程式,開啟
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 問題 這段 大多數情況下執行正常,但是某些情況下會出問題。什麼時候會出現什麼問...