C# 我想要多个读线程执行一次,然后一个写线程执行一次,一直轮回

.Net技术 码拜 10年前 (2015-05-10) 1110次浏览 0个评论
 

请大侠帮帮忙了,谢谢:

我想要多个读线程执行一次,然后一个写线程执行一次,再多个读线程执行一次,然后一个写线程执行一次,这样一直轮回。

用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);
                
            }
        }



       



    }
}

我是想要这样的效果:
C# 我想要多个读线程执行一次,然后一个写线程执行一次,一直轮回

30分
编写多线程程序,你这里走的是“编程大忌”的路数。良好的多线程的程序不是这样设计的。

1. 过程中不会有死循环,同时也轻易不会有(信号量)阻塞。
2.. T1~T6执行完毕,才会执行T7。同样T7执行完毕之后,才会启动T1(2)~T6(2)。而且启动的新线程是从系统线程池中自动分配的,而不是你事先阻塞6个线程在那里。

既然线程可以一直工作,为什么非要结束后再开启多此一举呢?
ReaderWriterLockSlim的工作方式,基本上弄明白了:

前提:
一、rwl工作的时候,分为:读模式,写模式
二、写线程应该在写模式完成后,休息一下,WIN上最小单位大概是sleep(70~100).   即sleep(1) 等于sleep(70).  

工作原理:

1. 读线程
2. 写线程
3. 无锁时间

当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也许不是我说的那样,但我的实验大致如此)


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 我想要多个读线程执行一次,然后一个写线程执行一次,一直轮回
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!