在我的程序中,我使用一个线程池来分配我的所有任务,例如计时器任务,非阻塞套接字I/O等。任务实际上是一个回调函数,将在收到特定事件时执行。

该体系结构是:

  • 主线程调用epoll()来收获I/O事件,然后将I/O回调调度到线程池。
  • 主线程还处理计时器超时,并将超时回调分配给线程池
  • 在I/O回调中,一个定时器任务可能会被取消,具体取决于I/O处理结果。
  • 在运行一个I/O回调期间,不会监视coresponding套接字是否存在其他相同事件。
  • Durning正在运行一个计时器回调,该计时器任务将暂时从计时器任务队列中删除。

  • 这是问题所在:
  • 在池中的线​​程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);
    

    如果不解决这些问题,我将无法继续工作。请帮助我!

    我应该在单个进程中为不同类型的任务使用单独的线程池吗?还是只使用单线程?

    任何建议表示赞赏!

    最佳答案

    您可以使用受其自身的互斥锁保护的全局计时器表。该表实际上不需要是全局的,但可以属于某个集合,例如拥有您正在执行I/O的所有内容的任何集合。

    然后使用以下逻辑:

    要创建计时器:

  • 锁定全局表。
  • 以“pending”状态将计时器添加到全局表中。
  • 解锁全局表。
  • 使用线程池调度计时器。

  • 要触发计时器:
  • 锁定全局表。
  • 检查计时器的状态。如果不是“待定”,则删除计时器,解锁表格,然后停止。
  • 将计时器的状态更改为“开火”。
  • 解锁全局表。
  • 执行计时器操作。
  • 锁定全局表。
  • 从表中删除计时器。
  • 解锁全局表。

  • 要取消计时器:
  • 锁定全局表。
  • 查找计时器。如果状态为“待处理”,则将其更改为“已取消”。不要删除它。
  • 解锁全局表。
  • 关于c - 服务器架构难题,C编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12456267/

    10-08 22:28