当前位置: 代码迷 >> C# >> C# 小弟我想要多个读线程执行一次,然后一个写线程执行一次,一直轮回
  详细解决方案

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

热度:109   发布时间:2016-05-05 03:56:11.0
C# 我想要多个读线程执行一次,然后一个写线程执行一次,一直轮回
本帖最后由 ot512csdn 于 2015-04-29 22:58:01 编辑
请大侠帮帮忙了,谢谢:

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

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



       



    }
}



我是想要这样的效果:

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

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