1

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

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

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

4

4 回答 4

2

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

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

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

于 2013-07-03T06:56:31.043 回答
1

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

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

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

于 2013-07-03T07:01:53.790 回答
0

希望这有助于解决您的问题http://man7.org/linux/man-pages/man3/pthread_getschedparam.3.html

于 2013-07-03T06:56:32.813 回答
0

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

于 2013-07-03T07:40:26.973 回答