Multithreading 知道有多少人在等待pthread互斥锁

Multithreading 知道有多少人在等待pthread互斥锁,multithreading,locking,pthreads,Multithreading,Locking,Pthreads,我想知道有多少线程正在等待一个锁,这样我就能够安全地销毁它 问题是当有人拿着锁或者有人在等锁的时候,我不能把它毁掉。 我的程序可以确保没有新的请求来获取锁,但是我如何知道等待它的所有线程何时都完成了锁定 我考虑过一个条件变量,但我怀疑它会产生问题。dlv,您能在描述中添加一些代码片段吗。 我希望你应该使用条件变量 每个线程将在pthread\u cond\u wait()中阻塞,直到另一个线程发出信号将其唤醒。这不会导致死锁。通过为每个线程分配一个int、pthread\u cond\u t和p

我想知道有多少线程正在等待一个锁,这样我就能够安全地销毁它

问题是当有人拿着锁或者有人在等锁的时候,我不能把它毁掉。 我的程序可以确保没有新的请求来获取锁,但是我如何知道等待它的所有线程何时都完成了锁定


我考虑过一个条件变量,但我怀疑它会产生问题。

dlv,您能在描述中添加一些代码片段吗。 我希望你应该使用条件变量

每个线程将在
pthread\u cond\u wait()
中阻塞,直到另一个线程发出信号将其唤醒。这不会导致死锁。通过为每个线程分配一个
int
pthread\u cond\u t
pthread\u mutex\u t
,可以很容易地将其扩展到多个线程

pthread\u cond\u wait()
阻塞调用线程,直到发出指定条件的信号。这个例程应该在互斥锁被锁定时调用,它会在等待时自动释放互斥锁。接收到信号并唤醒线程后,互斥锁将自动锁定以供线程使用。然后,程序员负责在线程使用完互斥锁后解锁互斥锁

pthread\u cond\u signal()
例程用于通知(或唤醒)另一个正在等待条件变量的线程。它应该在锁定互斥锁后调用,并且必须解锁互斥锁才能完成
pthread\u cond\u wait()
例程

如果多个线程处于阻塞等待状态,则应使用
pthread\u cond\u broadcast()
例程而不是pthread\u cond\u signal()

在调用
pthread\u cond\u wait()
之前调用
pthread\u cond\u signal()
是一个逻辑错误

使用这些例程时,正确锁定和解锁相关的互斥变量至关重要。例如: 调用
pthread\u cond\u wait()
之前未能锁定互斥锁可能会导致互斥锁不被阻塞。
调用
pthread\u cond\u signal()
后未能解锁互斥锁可能不允许匹配的
pthread\u cond\u wait()
例程完成(它将保持被阻止)。

如果可以使用互斥锁的线程仍然存在或将来可能会创建,则不要删除它

您知道并正在跟踪创建的线程,对吗

如果由于某种原因,您无法跟踪使用资源的线程,那么唯一的出路就是泄漏资源。它永远不会被安全地删除,因为您永远不知道何时使用完它


假设您有一个计数器,它使用互斥锁计算线程数。该计数器需要自己的互斥锁。那你怎么决定什么时候删除它呢?

那种思维方式是通往地狱的道路。你可以用条件变量做你想做的事情,但是结果会是一个非常弱的设计

假设您成功地创建了这样一个怪物,它基本上允许您“安全地”杀死任何其他线程,而不管其内部状态如何。除了快速而肮脏的紧急退出(在某些内部软件错误的情况下),这是解决同步问题最糟糕的方法

依赖这些技巧的设计必须在任务之间创建隐式同步,以确保终止以正确的顺序发生。很多软件都是这样设计的,大多数软件都允许平庸的程序员通过维护他们最初创造的一堆垃圾来谋生


任务终止应该是一个在全局设计级别解决的问题,而不是通过一个由不稳定对象组成的工具箱来解决的问题,该工具箱允许您以任何奇怪的方式扭曲同步。

您太不稳定了。任何这样的信息,即使可用,在你得到它的时候都是过时的。更改您的设计,使这些信息。不需要。