在我的程序中,我使用单个线程池来调度我的所有任务,例如定时器任务、非阻塞套接字 I/O 等。任务实际上是一个回调函数,它会在收到特定事件时执行。
架构是:
主线程调用 epoll() 来收集 I/O 事件,然后将 I/O 回调分派到线程池。
主线程也处理定时器超时,并将超时回调分派到线程池
在 I/O 回调中,可能会取消一个定时器任务,具体取决于 I/O 处理结果。
在一个 I/O 回调运行期间,不会监视对应的套接字是否有进一步的相同事件。
在一个定时器回调运行期间,该定时器任务将暂时从定时器任务队列中移除。
这是问题所在:
在池中的线程 A 正在运行计时器回调 T 期间。
池中的线程 B 可能正在运行另一个回调(为套接字 I/O 读取事件注册),在收到处理请求后,线程 B 决定删除定时器任务 T,但该定时器任务 T 正在由线程 A 执行.
我可以为定时器任务添加一个锁,但是我应该把锁放在哪里呢?我不能将锁对象放在定时器任务结构中,因为当我决定释放任务对象时,我必须已经获得了锁,释放并持有锁,可能会导致未定义的行为:
pthread_mutex_lock(T->mutex);
free(T);
/*without a pthread_mutex_unlock(T->mutex);*/
如果另一个线程被阻塞会发生什么:
pthread_mutex_lock(T->mutex);
如果没有解决这些问题,我将无法继续我的工作。请帮助我!
我应该在单个进程中为不同类型的任务使用单独的线程池吗?还是只使用单线程?
任何建议表示赞赏!