我想知道有多少线程在等待锁定,所以我可以安全地销毁它。
问题在于,当有人持有或有人在等待时,我无法销毁锁定。 我的程序可以确保没有新的请求来获取锁,但是我怎么知道等待它的所有线程何时完成呢?
我想到了一个条件变量,但我怀疑它会产生问题..
答案 0 :(得分:0)
dlv,您可以在说明中添加一些代码段吗? 我希望你应该使用条件变量,
每个线程将在pthread_cond_wait()
中阻塞,直到另一个线程发出信号唤醒它为止。这不会导致死锁。通过为每个线程分配一个int
,pthread_cond_t
和pthread_mutex_t
,可以轻松将其扩展到多个线程。
pthread_cond_wait()
阻塞调用线程,直到指示条件被发出信号。应该在锁定互斥锁时调用此例程,并在等待时自动释放互斥锁。收到信号并唤醒线程后,互斥锁将自动锁定以供线程使用。然后程序员负责在线程结束时解锁互斥锁。
pthread_cond_signal()
例程用于发信号(或唤醒)正在等待条件变量的另一个线程。它应该在锁定互斥锁后调用,并且必须解锁互斥锁才能完成pthread_cond_wait()
例程。
如果多个线程处于阻塞等待状态,则应使用pthread_cond_broadcast()
例程而不是pthread_cond_signal()。
在致电pthread_cond_signal()
之前致电pthread_cond_wait()
是合乎逻辑的错误。
使用这些例程时,必须正确锁定和解锁相关的互斥锁变量。例如:
在调用pthread_cond_wait()
之前未能锁定互斥锁可能导致它不被阻塞。
调用pthread_cond_signal()
后未能解锁互斥锁可能无法完成匹配的pthread_cond_wait()
例程(它将保持阻止状态)。
答案 1 :(得分:0)
如果可以使用互斥锁的线程仍然存在或将来可能创建,则不要删除它。
你知道并且正在跟踪创建的线程,对吗?
如果由于某种原因,您无法使用资源跟踪线程,那么唯一的出路就是泄漏资源。它永远不会被安全删除,因为你永远不知道你什么时候使用它。
假设您有一个使用互斥锁计算线程的计数器。该计数器需要自己的互斥锁。那么你如何决定何时删除那个?
答案 2 :(得分:0)
这种思维方式是导致地狱的道路。你可以用条件变量做你想做的事,但结果将是一个极其微弱的设计。
假设你设法创造了这样一个怪物,它基本上可以让你安全地杀死#34;任何其他线程,无论其内部状态如何。除了快速和肮脏的恐慌退出(在某些内部软件错误的情况下),这是解决同步问题的最坏方法。
依赖这些技巧的设计必须在任务之间创建隐式同步,以确保终止以正确的顺序发生。许多软件都是以这种方式设计的,其中大多数软件允许平庸的程序员通过维护他们首先创建的垃圾堆来谋生。
任务终止应该是一个在全球设计层面解决的问题,而不是一个允许你以任何奇怪方式扭曲同步的不稳定对象的工具箱。