c - 为什么在信号处理程序中使用互斥锁会出现问题?

标签 c multithreading signals mutex deadlock

下面是有问题的伪代码:

int c;
pthread_mutex_t mtx;


void inc(int count)
{
    pthread_mutex_lock(&mtx);
    c += count;
    pthread_mutex_unlock(&mtx);
}


int main(void)
{
    pthread_mutex_init(&mtx);
    signal(SIGUSR1, inc);
    signal(SIGUSR2, inc);
    sleep(100000); // Sleep for long enough
    return 0;
}

这段代码如何以及为什么会导致死锁?

为什么这与以下场景不同:

  1. Thread 1 acquires the mutex.
  2. Context switch is made and Thread 2 tries to get the lock and put on waiting list.
  3. Thread 1 finishes and releases the lock.
  4. Thread 2 wakes up and continues its execution.
  5. No deadlock.

最佳答案

您的信号处理程序都将在同一个线程中运行。如果第二个信号到达,而第一个信号的处理程序已锁定互斥量,则您的独立线程将再次尝试锁定互斥量和死锁:

time    thread 0
----    --------
  0      main:...
  1      main:sleep()
 ...     ...
 100     <<SIGUSR1>>
 101     inc:pthread_mutex_lock()
 102     inc:count += ...
 103     <<SIGUSR2>>
 104     inc:pthread_mutex_lock()  // deadlock

关于c - 为什么在信号处理程序中使用互斥锁会出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32413397/

相关文章:

带指针声明的 C 动态结构赋值

ios - 如何知道其他线程中的任务何时完成?

java - 线程转储被阻止并锁定

.net - 线程安全无锁互字节数组队列

python - 我怎样才能传递给信号槽的信号在 pyqt4 中发送的参数更多?

c - 输入 switch case 将每个变量重置为零和一些提示

c - "initialization makes integer from pointer without a cast"数组初始化中逐渐减弱

c - 如何在 C api 中从 KDB+ 访问日期和 varbinary

c - 如何在 SIGINT 上仅终止前台子进程?

c - 使用 `SIGCHLD` 忽略 `sigaction(2)` 信号有什么用?