2009-12-14 67 views
2

如何中斷睡眠/阻塞的boost :: thread?Boost(v1.33.1)線程中斷

我正在使用Boost v1.33.1,升級不是一個選項。

謝謝。

+2

爲什麼它睡覺/被阻擋?如果你需要能夠根據需要喚醒它,讓它等待一個條件變量或互斥鎖或其他東西是否更有意義? – jalf 2009-12-14 14:06:10

+0

如果您可以建議更好的解決方案,我試圖給某段代碼添加超時: 我有一個阻塞調用,接收新數據並將其保存爲最新的數據。這個數據有一個使用期限,當它到期時我需要觸發一個事件*除非我在此期間收到新數據,在這種情況下,我會將超時重新初始化爲新的壽命並再次等待。 – James 2009-12-14 14:59:58

+0

是您需要的阻塞調用不可變的遺留代碼還是可以將其更改爲非阻塞/超時? – 2009-12-14 15:07:43

回答

1

在1.33中快速瀏覽boost.thread的文檔表明,沒有便捷的方法來實現中斷。在1.35中引入了線程中斷(對於其中一個「中斷點」中的線程)。

因此,我能想到的唯一選擇是使用信號(它不在1.33中,因此您需要回退,例如pthread),並結合任何方法的超時那是阻塞的。基本上使用信號來喚醒睡眠中的線程,讓它們睡眠等待信號,並在阻塞線程時超時以喚醒它們並檢查它們是否應該退出。不幸的是,這是一個非常不理想的解決方案,並且在某種程度上等於內部無論如何都需要更新版本的boost。

如果您使用的是boost.thread,那麼您應該考慮升級到其他項目的更新版本,因爲1.33不支持絕大多數對於多線程至關重要的構造。

0

無法在boost :: thread中中斷阻塞的線程。你需要自己實現正確的線程中斷,例如使用boost :: conditional。 AFAIK任何現有的中斷正在運行的線程的方法(例如Windows API中的TerminateThread)只會導致問題(內存泄漏其中之一)。

1

我同意begray,看看情況變量。如果你有不時想起牀的線索,那麼它們就是你希望使用的東西。如果您希望線程阻塞其他呼叫(例如調用BSD套接字或類似的東西),這不會對您有所幫助。您需要直接使用這些調用的超時設施(如果存在)。

下面是一個示例,僅使用boost 1.33.1中提供的工具。我沒有編譯它,所以可能會有小錯誤。我已經包含了一個模糊的Work類的使用,但是您根本不需要使用共享數據來使用這種模式。只需要互斥體和條件變量。

Work work; 
boost::condition workAvailable; 
boost::mutex workMutex; 

void Producer() 
{ 
    { 
    boost::mutex::scoped_lock lock(workMutex); 
    UpdateWork(work); 
    workAvailable.notify_one(); 
    } 
    boost::mutex::scoped_lock lock(workMutex); 
    work.SetOver(); 
    workAvailable.notify_one(); 
} 

void Consumer() 
{ 
    //This thread uses data protected by the work mutex 
    boost::mutex::scoped_lock lock(workMutex); 
    while(true) 
    { 
    //this call releases the work mutex 
    //when this thread is notified, the mutex is re-acquired 
    workAvailable.wait(lock); 
    //once we have the mutex we can work with shared data 
    //which might require this thread to terminate 
    if(work.Over()) 
    { 
     return; 
    } 
    DoWork(work); 
    } 
} 

生產者線程將創建一個工作單元,然後阻止。消費者線程將完成工作,然後阻止。然後生產者線程將設置終止條件並退出。消費者然後將退出。

+1

我剛剛注意到有關阻止傳統呼叫的評論,他認爲這是他的核心問題。這絕對無助於回答原來的問題。我不知道在boost 1.33.1中是否有安全的方式來終止阻塞呼叫。如果傳統調用是異常安全的,則後續版本的boost可以提供幫助。 我考慮刪除這個,但我會在這裏留下,因爲答案可能對OP以外的人有用。 – 2009-12-14 22:22:29