线程同步和设置线程的优先级

时间:2013-07-03 06:32:47

标签: c windows multithreading winapi tcp

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

  1. 如果40个线程中的任何一个处于临界区,并且所有其他线程也在等待进入临界区,同时1秒计时器已启动,我想忽略所有其他线程的请求进入临界区,发件人线程现在必须优先考虑,必须给予关键部分。
  2. 换句话说,我想将发送方线程的优先级设置为1,即当发送方线程调用EnterCriticalSection()时,必须忽略等待进入临界区的所有其他线程,并且一旦临界区释放,它必须提供给发送者线程。 有没有办法实现这个功能?

4 个答案:

答案 0 :(得分:2)

您无法通过仅使用优先级来实现它,因为如果任何工作线程持有锁,则优先级不能强制它们释放它。这是我能想到的一个实现..

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

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

答案 1 :(得分:1)

您可能只想要一些读写器锁的变体。可能只需要一个普通的Win32临界区锁即可。

这就是原因。关键部分中的操作将数据附加到队列(或从队列中读取)是非阻塞操作。换句话说,队列上的任何操作都不会花费超过一毫秒的时间。如果使用Windows critical section lock(EnterCriticalSection,LeaveCriticalSection),则保证等待进入CS的线程的公平性(我非常肯定)。

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

答案 2 :(得分:0)

答案 3 :(得分:0)

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