线程操作的一些基本方法,非教程类,备忘用的。
private static object obj = new object(); private static ReaderWriterLock _rwl = new ReaderWriterLock(); private static Mutex _mutexThread = new Mutex(); private static Mutex _mutexProcess = new Mutex(false, "tansea"); private static ManualResetEvent _manual = new ManualResetEvent(false); private static AutoResetEvent _auto = new AutoResetEvent(false); private static Semaphore _semaphoreThread = new Semaphore(0, 10); private static Semaphore _semaphoreProcess = new Semaphore(0, 10, "tansea"); private static int i = 10; public void Example() { Thread.Sleep(1000); //等待1秒,等待期间会交出CPU控制权 Thread t = new Thread(ThreadExample); t.Join(); //阻塞主线程,直到子线程执行完成 t.Interrupt(); //中断子线程的Sleep方法并抛出ThreadInterruptedException异常 t.Abort(); //中断子线程 } private void ThreadExample() { Monitor.Enter(obj); //进入临界区,obj为临界资源 Monitor.Wait(obj); //挂起线程,暂时释放资源锁,一般写在Monitor.Enter之后 Monitor.Pulse(obj); //唤醒线程 Monitor.Exit(obj); //退出临界区 _rwl.AcquireWriterLock(TimeSpan.FromSeconds(30)); //写锁 _rwl.ReleaseWriterLock(); //释放写锁 _rwl.AcquireReaderLock(TimeSpan.FromSeconds(30)); //读锁 _rwl.ReleaseWriterLock(); //释放读锁 _mutexThread.WaitOne(); //进入临界区(线程相关) _mutexThread.ReleaseMutex(); //退出临界区(线程相关) _mutexProcess.WaitOne(); //进入临界区(进程相关) _mutexProcess.ReleaseMutex(); //退出临界区(进程相关) Interlocked.Increment(ref i); Interlocked.Decrement(ref i); Interlocked.Add(ref i, 10); Interlocked.Exchange(ref i, 10); Interlocked.CompareExchange(ref i, 10, 20); _manual.WaitOne(); //挂起线程,直到信号量为true _manual.WaitOne(2000); //挂起线程,直到信号量为true,或者是超时 _auto.WaitOne(); //挂起线程,直到信息量为true _auto.WaitOne(2000, true); //挂起线程,直到信号量为true,或者是超时, //和_manual不同,_auto在超时后会改变信号量的值 _semaphoreThread.WaitOne(); //当前信号量为0,挂起线程(线程相关) _semaphoreThread.Release(10); //释放信号量(线程相关) _semaphoreThread.WaitOne(); //当前信号量为10,可以进入线程(线程相关) _semaphoreProcess.WaitOne(); //当前信号量为0,挂起线程(进程相关) _semaphoreProcess.Release(10); //释放信号量(进程相关) _semaphoreProcess.WaitOne(); //当前信号量为10,可以进入线程(进程相关) }