執行緒池還沒執行完畢 main函式就結束了

2021-10-13 21:35:11 字數 2228 閱讀 3197

例子:本應該執行30次,結果執行了9次就結束了

#include

#include

#include

"threadpool.hpp"

class

test

static

void

fun2()

};void

fun(

int i)

; std::this_thread::

sleep_for

(std::chrono::

milliseconds

(4000))

; std::cout <<

"task "

<< i <<

" working in thread "

<< std::this_thread::

get_id()

<< std::endl;

}int

main

(int argc,

char

* ar**)

std::cout <<

"結束執行緒"

解決辦法:

方法一:在迴圈體中或是迴圈體外加入等待時間,此時總的等待時間必須是大於執行緒函式總的處理時間,不好控制

#include

#include

#include

"threadpool.hpp"

class

test

static

void

fun2()

};void

fun(

int i)

; std::this_thread::

sleep_for

(std::chrono::

milliseconds

(4000))

; std::cout <<

"task "

<< i <<

" working in thread "

<< std::this_thread::

get_id()

<< std::endl;

}int

main

(int argc,

char

* ar**)

std::cout <<

"結束執行緒"

<<:endl>

return0;

}

方法二:在主函式的迴圈體外加入死迴圈,等待任務隊列為空,此時也會出現在某一時刻任務隊列為空,直接退出,所以需要加入雙層迴圈進行判斷。

#include

#include

#include

"threadpool.hpp"

class

test

static

void

fun2()

};void

fun(

int i)

; std::this_thread::

sleep_for

(std::chrono::

milliseconds

(4000))

; std::cout <<

"task "

<< i <<

" working in thread "

<< std::this_thread::

get_id()

<< std::endl;

}int

main

(int argc,

char

* ar**)

std::this_thread::

sleep_for

(std::chrono::

milliseconds(20

));while

(!threadpool.

isempty()

) std::cout <<

"結束執行緒"

方法三:使用條件變數使執行緒同步

Java等待多個執行緒執行完畢

1 使用join public class testcountdownlatch2 for int i 0 i 10 i for int i 0 i 10 i system.out.println main done class workthread implements runnable 2 使用...

執行緒同步 等待所有執行緒執行完畢

在多執行緒程式中經常會碰到執行緒同步 場景1主線程啟動多個子執行緒後,主線程需要等待所有的子執行緒執行完畢後,主線程才能進一步向下執行。c 提供了 manualresetevent 類為我們的執行緒同步提供了方便.manualresetevent.waitall new waithandle wai...

執行緒池迴圈執行

using system using system.collections.generic using system.linq using system.text using system.threading public class lockobj 正處理佇列 public queuequeuep...