我正在使用2.6.24.3內核爲嵌入式Linux項目開發用戶空間應用程序。 我的應用程序通過創建2個pthread來在兩個文件節點之間傳遞數據,每個睡眠直到異步IO操作完成,然後喚醒並運行完成處理程序。我可以防止在關鍵代碼中產生Linux用戶空間pthread嗎?
完成處理程序需要跟蹤有多少個傳輸處於掛起狀態,並維護一個線程將添加到另一個線程並將另一個線程移除的鏈接列表。
// sleep here until events arrive or time out expires
for(;;) {
no_of_events = io_getevents(ctx, 1, num_events, events, &timeout);
// Process each aio event that has completed or thrown an error
for (i=0; i<no_of_events; i++) {
// Get pointer to completion handler
io_complete = (io_callback_t) events[i].data;
// Get pointer to data object
iocb = (struct iocb *) events[i].obj;
// Call completion handler and pass it the data object
io_complete(ctx, iocb, events[i].res, events[i].res2);
}
}
我的問題是這樣的......
有一個簡單的辦法可以防止當前活動的線程產生,而它運行完成處理,而不是下降互斥/自旋鎖路線?
或者失敗了,可以配置Linux來防止在持有互斥鎖/自旋鎖時產生pthread?
該要求主要是試圖保持代碼簡單,有幾個項目需要在完成處理程序中互斥,但如果您可以確保它只會在處理程序之外產生,我認爲您不需要任何。 我想另一種選擇是在整個處理程序周圍放一個粗糙的互斥體。 – KermitG 2010-05-19 15:10:33
@KermitG:如果您擔心完成處理程序代碼本身與另一個線程中的代碼競爭,那麼只需防止搶佔將無濟於事。當完成處理程序啓動時,另一個線程可能已經在臨界區內;即使在完成處理程序運行時暫停它,它仍然會看到它正在處理的數據將從其下方更改。通常,如果處理程序中的代碼可以競爭,則處理程序本身應負責鎖定。 – caf 2010-05-19 21:47:49