2013-07-03 59 views
1

我有一个发件人线程和40个工作线程。有一个队列。所有40个线程都写入队列,并且发送方线程定期从共享队列读取数据,并通过tcp套接字读取数据(例如,每隔1秒后,发送方线程必须从队列读取数据并通过套接字发送数据)。我这里有一个问题:线程同步和设置线程的优先级

  1. 如果任何一个40个线程的是在关键部分和所有其他线程也在等待进入临界区,并在同一时间1秒计时器了,我想忽略所有其他线程进入关键部分的请求以及发送者线程必须优先考虑,并且必须给出关键部分。

换句话说,我想发送线程的优先级设置为1点,即当发件人线程调用EnterCriticalSection的(),那么,正在等待进入临界区的所有其他线程必须被忽略,一旦关键部分获得免费,它必须给予发件人线程。 有什么办法可以实现这个功能吗?

回答

2

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

只要发送者线程在1秒的持续时间内唤醒,它就会向工作进程发送一个信号。在信号处理程序中释放由工作人员持有的锁(我猜这里是一个二进制信号量,因此在信号处理程序中它的值为0),所以无论工作线程将尝试访问它都会被阻塞。在发送端发送的所有数据包,并在重新设置信号灯回1

这到底是一种实现方式,你能想到的认为自己这样的,但最终它应该工作。:)

1

你可能只想要一个读写器锁的变种。可能只是一个简单的Win32临界区锁是所需要的。

这是为什么。关键部分中的操作将数据附加到队列(或从队列读取)是非阻塞操作。换句话说,队列上的任何操作都不会超过几分之一毫秒。如果你使用Windows critical section lock(EnterCriticalSection,LeaveCriticalSection),则保证公平性等待进入CS的线程(我相当确定这一点)。

所以,如果所有40个写线程需要进入CS追加到队列中,这应该不会超过一两毫秒为读者线程多等待轮到获取锁。当然,这是假定写入线程仅复制存储队列,而不是做任何长阻塞I/O操作,而具有获得锁。

0

您的问题的一个可能的解决方案在于线程在Linux中实现的方式。尝试并有一个互斥体。让你的发件人线程创建一个名为FIFO(使用mkfifo()调用),而且,当你创建说40个工作者线程,在各自的职责,让他们用于接收创建一个名为FIFO。每当你的发件人线程想要与你的工作线程之一进行通信,使用open()调用打开worker_fifo和写入光盘,关闭它。但是当你有事情,比如用户客户端应用程序的事情,当你打开一个FIFO,把一个互斥锁,做你想做的(读/写)和解锁互斥,当你用它做。

+0

而且,即使信号也适合同步 – 2013-07-03 07:53:56