我在Linux內核2.4中實現用戶線程,並且我使用ualarm來調用線程之間的上下文切換。使用sigprocmask來實現鎖
我們有一個要求,我們的線程庫的函數應該不會被線程的上下文切換機制中斷,所以我查看了阻塞信號,並瞭解到使用sigprocmask是執行此操作的標準方法。
但是,它看起來像我需要做不少來實現這一點:
sigset_t new_set, old_set;
sigemptyset(&new_set);
sigaddset(&new_set, SIGALRM);
sigprocmask(SIG_BLOCK, &new_set, &old_set);
此塊SIGALARM但它確實這3個函數調用!這些功能運行所需的時間會很多,包括髮送的信號。 最好的辦法,我不得不減輕這是暫時禁用ualarm,像這樣:
sigset_t new_set, old_set;
time=ualarm(0,0);
sigemptyset(&new_set);
sigaddset(&new_set, SIGALRM);
sigprocmask(SIG_BLOCK, &new_set, &old_set);
ualarm(time, 0);
這是除了這種感覺冗長的罰款。沒有更好的方法來做到這一點?
」阻止信號並不意味着您的代碼將不可中斷。「是的,我的意思是我正在執行的上下文切換機制不可中斷(更新的問題)。 ualarm每THREAD_TIME_SLICE關閉,處理程序將執行切換到另一個線程。 – EpsilonVector 2010-05-18 01:47:52