|
请大侠帮帮忙了,谢谢: 我想要多个读线程执行一次,然后一个写线程执行一次,再多个读线程执行一次,然后一个写线程执行一次,这样一直轮回。 用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也许不是我说的那样,但我的实验大致如此) |
|