2010-05-16 103 views
9

我正在考慮在我的應用程序中使用C++ 0x線程而不是Boost線程。然而,我不確定如何重新實現我的標準C++ 0x線程,因爲它們似乎沒有interrupt()方法。如何中斷一個正在等待的C++ 0x線程?

我目前的設置是:

  • 管理工作的一個主線程;
  • 幾個執行主命令的工作線程。

工人在至少兩個不同的條件變量上調用wait()。師父有一個「超時」狀態:在這種情況下,它告訴所有工作人員停止並給出他們當時得到的結果。使用Boost線程主機只在線程組上使用interrupt_all(),這會導致工作人員停止等待。如果他們現在還沒有等待,主人還會設置一個bool標誌,定期檢查工人。

但是,在C++ 0x std::thread我看不到任何替代interrupt()。我想念什麼?如果沒有,我怎樣才能落實上述計劃,使工人不會永遠睡眠?

回答

9

不幸的是,我沒有看到另一種方式比輪詢,而不是等待使用定時等待和變量來表明中斷已完成。如果你有他們和兩個功能中斷和check_interruption_point,這與拋出interrupted_exception如果布爾值爲true

void th(Interruptor& interruptor) { 
    try { 

    ... 

    while (cnd1.timed_wait(d)==false) { 
     interruptor.check_interruption_point(); 
    } 
    ... 
    } catch (interrupted_exception &) {} 
} 

斷續器類將保持與互斥保護或利用原子操作的布爾變量。 Mater線程將創建一個Interruptor變量,該變量將在創建時發送給相關線程。主人有可能立即中斷所有依賴這個中斷者的線程。如果你想一次明確地中斷一個線程,你當然可以爲每個線程創建一箇中斷器。

由您決定定時等待的持續時間,以便您的線程能夠在您的程序需要時立即做出反應。

+0

我想我會繼續使用Boost線程。他們也是越野車,但至少我對他們有一個穩定的解決方法。 – doublep 2010-05-17 13:47:09

1

中斷()的等待提升會在線程當前被阻塞的情況下發出notify_all,然後檢查是否請求了中斷。如果請求中斷,那麼它會執行一次拋出boost :: thread_interrupted。您可以使用該機制編寫基於std :: thread的自己的線程 。

+2

大概寫我自己的條件子類,以便線程知道它等待什麼?這對我來說聽起來有點太過分了。 – doublep 2010-09-04 23:24:43

1

的確,C++ 11 std :: thread並沒有提供這個標準的機制(還沒有?)。因此,我第二@ doublep決定暫時使用boost :: thread。

我們更願意使用C++ 11 std :: facilities。但是我們不想重新構建boost的terminate()工具,無條件地完成條件變量futzing以中斷睡眠等。創建像這樣的基礎設施是樂趣,並沒有那麼困難,但沒有生產力,並且比使用boost更不標準。

它有助於提升::線程和std ::線程是如此相似,我們覺得我們沒有把自己繪成一個角落。 (我們預計最終遷移到std :: thread會相對容易,甚至可能是微不足道的。)