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

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

  1. 如果40个线程中的任何一个处于关键部分,并且所有其他线程也等待进入关键部分,并且同时1秒计时器已经启动,并且我想忽略所有其他线程进入关键部分的请求,并且发送者线程现在必须被赋予优先级并且必须被赋予关键部分。

换句话说,我想设置发送者线程的优先级为1,即当发送者线程调用EnterCriticalSection()时,所有其他正在等待进入临界区的线程都必须被忽略,一旦临界区被释放,它必须是给予发送者线程。 有什么办法可以实现这个function吗?

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

一旦发送线程在1秒钟后唤醒,它将向工作进程发送一个信号。 在信号处理程序中释放由工作人员持有的锁(我猜这里是一个二进制信号量,因此在信号处理程序中将其值设置为0),因此无论工作线程将尝试访问它都将被阻止。 发送方发送所有数据包,最后再将信号量设置回1。

这是一个实现,你可以认为自己想像,但最终它应该工作。

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

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

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

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