gpt4 book ai didi

c - 为什么线程1重复获取锁,线程2就无法获取锁?

转载 作者:行者123 更新时间:2023-11-30 18:33:29 54 4
gpt4 key购买 nike

线程1:锁定、 sleep 、解锁;线程2:锁定、解锁;

但是线程2永远无法获取锁,线程1会重复获取锁。

我在Ubuntu 16.04(gcc 5.4)下尝试了很多次

pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);

std::thread t1([&mutex]() {
while (true) {
pthread_mutex_lock(&mutex);
std::cerr << "thread 1" << std::endl;
sleep(1);
pthread_mutex_unlock(&mutex);
}
});

std::thread t2([&mutex]() {
while (true) {
pthread_mutex_lock(&mutex);
std::cerr << "thread 2" << std::endl;
pthread_mutex_unlock(&mutex);
}
});

t1.join();
t2.join();

线程 1线程1线程1线程1线程1线程1线程1...

最佳答案

这个问题有一个名字。它的名字是 starvation ,当任何线程长时间保持互斥锁锁定时,这通常会成为一个问题。示例中的两个线程都尝试始终保持互斥体锁定。 (是的,他们每次循环都会解锁互斥锁,但随后他们会在下一条指令中重新锁定它。)

解决饥饿问题的最佳方法是,不要让互斥体保持锁定的时间超过必要的时间。当互斥体被锁定时,示例中的线程之一调用 sleep()。在任何实际程序中,这实际上总是是一个坏主意。

修复此问题的另一种方法是使用所谓的“公平”互斥体。公平互斥体的所有权始终授予等待时间最长的线程。它的效率低于常规类型的互斥体,但它可以轻松解决一些饥饿问题。不幸的是,可能没有任何标准方法(或根本没有任何方法)在任何给定平台上获得公平的互斥体。

<小时/>

仅供引用:您的示例中发生的情况是,线程 1 从 sleep() 调用中唤醒并释放互斥锁。一旦互斥锁被释放,两个线程之间就会展开一场竞赛,看看哪一个线程将获得它。不幸的是,当枪响时,线程 2 被阻塞等待互斥锁。操作系统将线程 2 移至“运行队列”,它必须在其中等待 CPU 运行。同时,线程 1 已经在运行。线程1再次获取互斥锁,然后线程2很快醒来,发现互斥锁被锁定,并返回等待。

关于c - 为什么线程1重复获取锁,线程2就无法获取锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57142886/

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