- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在我的 C++ 类中使用函数 poll()(我认为它可能是 POSIX 的一部分?)C 函数以便在文件更改时获取事件。这似乎工作得很好 - 但现在我还希望能够在我需要关闭线程时立即退出该函数。
我对此进行了研究并提出了几个我尝试过的想法 - 比如尝试发送信号,但我不知道如何让它发挥作用。
在下面的代码中(不是 100% 完整,但应该足以说明问题),我有一个 C++ 类,它从构造函数启动一个线程,并希望在析构函数中清理该线程。线程调用 poll(),它在文件更改时返回,然后通知委托(delegate)对象。监视线程循环直到 FileMonitor 对象指示它可以退出(使用返回 bool 的方法)。
在析构函数中,我喜欢做的是翻转 bool,然后做一些导致 poll() 立即退出的事情,然后调用 *pthread_join( )*。那么,关于如何让 poll() 立即退出有什么想法吗?
此代码是针对 Linux(特别是 debian)的,但我也在 Mac 上使用它。理想情况下,poll() API 的工作原理应该基本相同。
void * manage_fm(void *arg)
{
FileMonitor * theFileMonitor = (FileMonitor*)arg;
FileMonitorDelegate * delegate;
unsigned char c;
int fd = open(theFileMonitor->filepath2monitor(), O_RDWR);
int count;
ioctl(fd, FIONREAD, &count);
for (int i=0;i<count;++i) {
read(fd, &c, 1);
}
struct pollfd poller;
poller.fd = fd;
poller.events = POLLPRI;
while (theFileMonitor->continue_managing_thread()) {
delegate = theFileMonitor->delegate;
if (poll(&poller, 1, -1) > 0) {
(void) read(fd, &c, 1);
if (delegate) {
delegate->fileChanged();
}
}
}
}
FileMonitor::FileMonitor( )
{
pthread_mutex_init(&mon_mutex, NULL);
manage_thread = true;
pthread_mutex_lock (&mon_mutex);
pthread_create(&thread_id, NULL, manage_fm, this);
pthread_mutex_unlock(&pin_mutex);
}
FileMonitor::~FileMonitor()
{
manage_thread = false;
// I would like to do something here to force the "poll" function to return immediately.
pthread_join(thread_id, NULL);
}
bool FileMonitor::continue_managing_thread()
{
return manage_thread;
}
const char * FileMonitor::filepath2monitor()
{
return "/some/example/file";
}
最佳答案
将管道添加到您的文件监视器类,并切换您的轮询以获取原始文件描述符和管道的读取描述符以进行轮询。当您想唤醒您的文件监视器类以检查退出时,通过管道的写描述符发送一个字节,这将唤醒您的线程。
如果您有大量此类文件监视器,则可能会达到进程的最大文件描述符数(有关详细信息,请参阅 Check the open FD limit for a given process in Linux,在我的系统上,它是 1024 软,4096 硬)。如果您不介意它们同时醒来检查它们的退出指示器,您可以让多个监视器类共享一个管道。
关于c++ - 如何在 Linux 的 C 中使 poll() 立即退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22139915/
我是一名优秀的程序员,十分优秀!