2013-07-11 19 views
2

我想作爲一箇中斷髮生時儘快啓動一個線程中的一個線程。但是,我意識到我無法從中斷處理程序(或者直接或間接被中斷處理程序調用的任何函數)內啓動線程。所以,我決定做的是讓處理程序聲明一個標誌。然後,一個單獨的線程連續監視該標誌,如果它被聲明,它將依次創建(並啓動)一個線程。這裏是一個僞代碼:起價中斷處理程序

int interrupt_flag = 0; 

interrupt_handler(void) 
{ 
    interrupt_flag = 1 
} 

monitoring_thread(void) //this thread is started at the start of the program 
{ 
    while(1) 
    { 
    if(interrupt_flag) 
    { 
     interrupt_flag = 0; 
     //start the thread here 
     sleep(/*some amount of time*/); 
    } 
    } 
} 

我不是真的很高興有一個專門的while循環不斷監視一個標誌。問題在於它顯着降低了我程序中其他線程的速度。出於這個原因,我調用睡眠函數來提高程序中其他線程的速度。

問:是否有一種方法,我可以真正中斷時啓動一個線程,而無需專門的while循環?是否有解決方法從中斷處理程序中啓動線程?

如果這有什麼差別,我使用的POSIX庫。

謝謝,

PS。這個問題具有一定的相關貼在這裏前面一個問題:

Sharing data between master thread and slave thread in interrupt driven environment in C

+0

如果中斷處理程序搶佔當前任務,我期望它會有一些API調用它來安排一些其他任務(或回調)運行來做t他真正的工作。有沒有這樣的事情可以在你的系統中完成?那個任務可以產生線程。 – jxh

+0

是的,如果這是一個操作系統(還有什麼會處理中斷?),那麼它應該有一種方法來喚醒等待的任務。 –

+0

傳統的方法是使用信號量。在中斷處理程序中調用任何可能阻塞的方法(例如互斥鎖)將導致最終的災難。 –

回答

3

而不必在你的旗幟監視線程自旋的,它可以等到中斷處理程序提供了一個線程應該催生通知。這樣做的一個方法是使用一個信號:

sem_t interrupt_sem; 

void interrupt_handler(void) 
{ 
    sem_post(&interrupt_sem); 
} 

void monitoring_thread(void) 
{ 
    while(1) 
    { 
    sem_wait(&interrupt_sem); 
    //start the thread here 
    } 
} 

以前,我有一個解決方案基於一個條件變量,但它是不可能,如果中斷處理程序,使阻塞調用你的系統將正常運行。它可能會導致死鎖或其他未定義的行爲,因爲系統中的變量在中斷髮生時可能沒有一致的值。

爲在自己和別人的評論中指出,操作系統應該提供某種接口來明確地喚醒等待任務。在上面的代碼中,我們假設監視線程始終在後臺處於活動狀態。

+0

太棒了!非常感謝! – Arash

+0

@Arash:你非常歡迎。 – jxh

+0

在中斷處理程序中調用'pthread_mutex_lock()'是不太可能的。如果監控線程中的中斷觸發了它的鎖定點,則會導致死鎖。 – caf

1

您可以使用POSIX信號也

你可以等待一個信號量的初始值由將被阻止等待

,並在你的信號處理函數發佈此信號的線是0

然後,上面的線程將被喚醒並做你想做的事情(創建線程)

+0

這是處理中斷處理程序/驅動程序和線程之間通信的傳統方法。 –

+0

請注意,如果中斷處理程序發佈到信號量,那麼它必須採取一些特殊的操作才能生效,而不是隻是中斷返回。有時候需要設置一個操作系統「標誌」,或者可能需要一個'ExitInterruptSchedule'函數調用或實際跳轉到一個OS入口點。這允許中斷處理程序在中斷返回之後立即準備好/運行線程,可能搶佔中斷之前正在運行的其他線程。 –