线程的一些基本用法

线程操作的一些基本方法,非教程类,备忘用的。

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,可以进入线程(进程相关)
}

 

posted @ 2017-05-31 14:30  TanSea  阅读(413)  评论(0编辑  收藏  举报