2011-11-25 54 views
3

我想在運行一定的時間後關閉openMP中的一個線程。我怎樣才能做到這一點?強制在C++中使用openMP關閉線程?

+1

可能重複(http://stackoverflow.com/questions/7978668/is-it-possible-to-kill-a-spinning-thread) –

+4

@JoachimPileborg它不是重複的。他問的是openmp,而不是明確的線程。 – Tudor

+0

@Tudor OpenMP線程和普通線程有什麼區別?一個線程是一個線程是一個線程,它是如何啓動應該不重要。 –

回答

5

OpenMP線程無法從外部強行殺死。他們沒有可用於執行加入,中斷,中止等操作的句柄。

實際上,OpenMP甚至沒有爲此設計。如果你需要做一些特殊的事情,讓運行時處理線程並使用顯式線程更好。

+0

你能提出一個跨平臺線程庫的C++,我可以在一段時間後強制關閉一個線程嗎? – rushafi

+0

也許你可以使用pthreads。 Windows本身不支持它們,但有像這樣的實現:http://sourceware.org/pthreads-win32/ – Tudor

0

我不知道是否可以爲特定線程執行此操作,但您可以使用trick實現類似的操作。你基本上做了什麼,你可以設置一個標誌,並在時間到時將其刷新到正在運行的線程中。檢查鏈接瞭解更多細節。

0

線程的殺死是可能的[外部並行],不使用openmp API,但通過pthread_cancel()

注意:內parallel節殺OpenMP的線程,不建議作爲for循環結束OpenMP的障礙將被期待的所有線程擊中障礙。如果一個線程不報告/命中,那麼它將是無限的掛起。此外,用戶可能不得不在清除查殺時處理線程/內存清理。

pthread_t pt; 
#pragma omp parallel for num_threads(3) firstprivate(i) 
for(n=0; n<10; ++n) 
{ 
     tid = gettid(); 
     pt = pthread_self(); 
     printf("i=%d - %d - thread : %d :: TID=%d\n",i++, n, omp_get_thread_num(), gettid()); 
} 
printf("TID : %d - PT=%d\n", tid, pt); 
pthread_cancel(pt); 
的[是否有可能殺了紡紗線?]