【问题标题】:Thread synchronization and setting thread's priority线程同步和设置线程的优先级
【发布时间】:2013-06-30 17:47:21
【问题描述】:

我有一个发送者线程和 40 个工作线程。有一个队列。所有 40 个线程都写入队列,发送者线程定期从共享队列中读取数据,并通过 tcp 套接字发送读取的数据(比如每 1 秒后,发送者线程必须从队列中读取数据并通过套接字发送)。我有一个问题:

  1. 如果 40 个线程中的任何一个处于临界区,并且所有其他线程也在等待进入临界区,同时 1 秒计时器到了,我想忽略所有其他线程的进入临界区的请求临界区,并且 Sender 线程现在必须被赋予优先级并且必须被赋予临界区。

换句话说,我想将发送者线程的优先级设置为 1,即当发送者线程调用 EnterCriticalSection() 时,必须忽略所有其他等待进入临界区的线程,并且一旦临界区空闲,它必须交给发送者线程。 有没有办法实现这个功能?

【问题讨论】:

    标签: c windows multithreading winapi tcp


    【解决方案1】:

    你不能只使用优先级来实现它,因为如果任何工作线程持有一个锁,那么优先级不能强制他们释放它。这是我能想到的一种实现方式..

    只要发送者线程在 1 秒后唤醒,它就会向工作进程发送信号。并且在信号处理程序中释放工作人员持有的锁(我猜这里二进制信号量会很好,所以在信号处理程序中将它的值设置为 0),所以无论工作线程试图访问它都会被阻塞。在发送方发送所有数据包,最后再次将信号量设置回 1。

    这是一种实现,你可以这样想你自己的,但最终它应该可以工作。:)

    【讨论】:

      【解决方案2】:

      您可能只需要一些读写锁的变体。而且可能只需要一个普通的 Win32 临界区锁就足够了。

      原因如下。临界区中的操作,将数据附加到队列(或从队列中读取),是一个非阻塞操作。换句话说,队列上的任何操作都不会超过几分之一毫秒。如果你使用Windows critical section lock(EnterCriticalSection,LeaveCriticalSection),则可以保证等待进入CS的线程公平(我对此相当肯定)。

      因此,如果所有 40 个写入线程都需要进入 CS 以追加到队列中,读取线程等待轮到获取锁的时间应该不会超过一到两毫秒。这当然是假设写入线程仅将内存复制到队列中,并且在获取锁时没有执行任何长阻塞 I/O 操作。

      【讨论】:

        【解决方案3】:

        【讨论】:

          【解决方案4】:

          您的问题的一个可能解决方案在于 Linux 中实现线程的方式。尝试使用互斥锁。让您的 Sender 线程创建一个命名的 FIFO(使用 mkfifo() 调用),并且,当您创建 40 个工作线程时,在它们各自的函数中,让它们创建一个命名的 fifo 用于接收。每当您的 Sender 线程想要与您的 Worker 线程之一进行通信时,请使用 open() 调用打开 worker_fifo 并写入它,然后关闭它。但是,当您拥有诸如用户-客户端应用程序之类的东西时,无论何时打开 fifo,放置互斥锁,做任何您想做的事情(读/写)并在完成后解锁互斥锁。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多