如何安全地删除c++中的posix计时器

How do I safely delete a posix timer in c++?

本文关键字:c++ 删除 中的 posix 计时器 何安全 安全      更新时间:2023-10-16

我正在编写的类包含posix计时器和这些计时器的处理程序。

如何安全地删除类?如果处理程序触发并看到类被删除,则会出现分段错误。

添加互斥锁会导致死锁-所以我想知道是否有任何关于在多线程环境中安全地在c++类中使用posix计时器的资源。

将计时器ID存储为类的私有成员,永远不返回ID,但始终在类的方法中包装使用它们的调用,并在析析函数中调用timer_delete() (http://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_delete.html)。这样,任何代码都不能保存无效的计时器ID。简而言之,得墨忒耳定律。

你对死锁的引用意味着问题是线程同步,所以shared_ptr可能是一种方法。这将只在删除对类对象的最后一个引用时删除它。您可以尝试其他方法,例如将线程同步到屏障或条件变量后面,并且仅在知道持有对象引用的每个线程当前都在等待或有读写锁时才删除。

根据glibc维护者的说法,使用零时间调用timer_settime()将解除定时器,让您安全地调用timer_delete()。他们说这确保了不会再有回调。