gpt4 book ai didi

c - 在拥有带有信号处理程序的多线程程序时,有没有办法确保原子性?

转载 作者:太空宇宙 更新时间:2023-11-04 01:53:48 24 4
gpt4 key购买 nike

如果我有这样的程序(伪代码):

mutex_lock;
func() {
lock(mutex_lock);
// Some code (long enough to make a
// race condition if no proper synchronisation
// is available). We also going to call a signal,
// say, SIGINT, through (ctrl-c), while we are in
// the range of locking and unlocking the lock.
unlock(mutex_lock);
}

sig_handler_func(sig) {
// Say, we are handling SIGINT (ctrl-c) signal
// And we need to call func from here too.
if (sig == SIGINT) {
func();
}
}

main() {
// Calling func from main
func();
}

那么当尝试获取 func 中的锁时会出现死锁,而它已经从“主”调用者处获取。我想知道是否有一种方法可以在 C 语言中暂停信号处理,具体来说,在这个例子中,当进入 func 并获取锁,并恢复信号处理并在退出 func 时调用处理程序。

最佳答案

你想要 pthread_sigmasksigprocmask 的多线程版本

下面是一些示例伪代码:

int
main(void)
{
sigset_t omask;
sigset_t nmask;

// add as many signals as you want to the mask ...
sigemptyset(&nmask);
sigaddset(&nmask,SIGINT);

// [temporarily] block signals
pthread_sigmask(SIG_BLOCK,&nmask,&omask);

// call function safely
func();

// restore signal mask
pthread_sigmask(SIG_SETMASK,&omask,NULL);

// pending signals should occur now ...
}

我不太确定,但是,您可能需要使用 pthread_sigmask 来阻止除一个 线程之外的所有线程中的信号,并仅从该线程执行上述操作。

此外,如果我不说我会重构您的代码,那我就是失职了。 [除此之外] 在信号处理程序中可以做的事情的数量是有限的(例如,没有 malloc,没有 printf 等)

将一个线程专用于信号处理并让它执行 sigsetjmp 并且信号处理程序执行 siglongjmp

或者让信号处理程序设置一个在基本级别监视的可变全局变量(例如 signal_occurred)。

因此,您将在信号处理程序中执行的所有“繁重工作”都可以从您可以执行任何操作的基本任务级别完成。

关于c - 在拥有带有信号处理程序的多线程程序时,有没有办法确保原子性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38313916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com