请大侠帮帮忙了,谢谢: 我想要多个读线程执行一次,然后一个写线程执行一次,再多个读线程执行一次,然后一个写线程执行一次,这样一直轮回。 用ReaderWriterLock 可以实现,但是用ReaderWriterLockSlim的时候却做不到。 比如下面的代码: namespace lock1 { public partial class Form1 : Form { static int theResource = 0; //static ReaderWriterLock rwl = new ReaderWriterLock(); private ReaderWriterLockSlim rwl = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion); public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; Thread t1 = new Thread(new ParameterizedThreadStart(myread)); //线程 Thread t2 = new Thread(new ParameterizedThreadStart(myread)); //线程 Thread t3 = new Thread(new ParameterizedThreadStart(myread)); //线程 Thread t4 = new Thread(new ParameterizedThreadStart(myread)); //线程 Thread t5 = new Thread(new ParameterizedThreadStart(myread)); //线程 Thread t6 = new Thread(new ParameterizedThreadStart(myread)); //线程 Thread t7 = new Thread(new ThreadStart(mywrite)); t1.Start(1); t2.Start(2); t3.Start(3); t4.Start(4); t5.Start(5); t6.Start(6); t7.Start(); } private void myread(object o) { int i = (int)o; while (true) { // rwl.AcquireReaderLock(-1); //无论花费多长时间,线程都会一直等到获得锁为止 rwl.TryEnterReadLock(-1); //Thread.Sleep(100); listBox1.Items.Insert(0, i.ToString() + "号 读线程 :" + theResource.ToString()); rwl.ExitReadLock(); // rwl.ReleaseReaderLock(); Thread.Sleep(10); } } private void mywrite() { while (true) { // rwl.AcquireWriterLock(-1); //无论花费多长时间,线程都会一直等到获得锁为止 rwl.TryEnterWriteLock(-1); theResource++; listBox1.Items.Insert(0, "---------------------写"); Thread.Sleep(1000); rwl.ExitWriteLock(); // rwl.ReleaseWriterLock(); Thread.Sleep(10); } } } } 我是想要这样的效果: |
|
30分 |
编写多线程程序,你这里走的是“编程大忌”的路数。良好的多线程的程序不是这样设计的。
1. 过程中不会有死循环,同时也轻易不会有(信号量)阻塞。 |
既然线程可以一直工作,为什么非要结束后再开启多此一举呢?
|
|
ReaderWriterLockSlim的工作方式,基本上弄明白了:
前提: 工作原理: 1. 读线程 当2运行时,所有的1是停止的。2运行完后,应该休息一下,造成有一点无锁的时间,这时候,很多1会抢上来运行。 这些1,在运行完一次后,如果还在休息(无锁)时间内,即2还没有醒,1们还会再继续运行,就会出现2运行一次后,1运行多次。 如果1在运行时,2的休息(无锁)时间已结束,2会开始申请写锁…… 一旦1运行完毕,2会优先进入写锁,1会阻塞直到下一个无锁时间片到来。 解决方法是: 在锁线程一次完成后,sleep(1) 出一个休息(无锁)时间片。( WIN平台,sleep(1) =sleep(70) ) 在读线程中,一次执行时长要大于sleep(70),让写锁在读线程运行结束前醒来。 这样就可以N个读线程做一次,一个写线程做一次。 (WIN平台的SLEEP也许不是我说的那样,但我的实验大致如此) |