zoukankan      html  css  js  c++  java
  • 线程的一些基本用法

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

    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,可以进入线程(进程相关)
    }
  • 相关阅读:
    ASP.Net无法连接Oracle的一个案例
    给Oracle添加split和splitstr函数
    笨猪大改造
    设计模式(一)策略模式
    jQuery select 操作全集
    现在的心情
    jquery 自动实现autocomplete+ajax
    c# 配置连接 mysql
    jquery.ajax和Ajax 获取数据
    C# 加密可逆
  • 原文地址:https://www.cnblogs.com/TanSea/p/Thread.html
Copyright © 2011-2022 走看看