ファイルが変更されたときにイベントを取得するために、関数poll() (POSIX の一部であると思いますか?) を C++ クラスで使用しています。これは問題なく動作するようですが、スレッドを閉じる必要があるときに関数をすぐに終了できるようにしたいと考えています。
私はこれを調査し、試してみたいくつかのアイデアを思いつきました-信号を送信しようとするなど、これを機能させる方法を理解できませんでした.
以下のコード (100% 完全ではありませんが、問題を説明するのに十分なはずです) には、コンストラクターからスレッドを開始し、そのスレッドをデストラクターでクリーンアップしたい C++ クラスがあります。スレッドは、ファイルが変更されたときに返されるpoll()を呼び出し、デリゲート オブジェクトに通知します。監視スレッドは、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";
}