c#线程2

news/2024/7/6 0:00:56

 

多线程中很有可能存在争夺一个变量资源而产生死锁或者不被期望的结果。

测试类;

    class TestClass
    {
        private int num = 100;
        private object objLock = new object();

        public void MissYou()
        {
            while (true)
            {
                lock (objLock)
                {
                    SomeTest();
                }
            }
        }

        public void SomeTest()
        {
            ++num;
            if (num == 100)
            {
                Console.WriteLine("我不是针对谁,在座的各位");
            }
            num = 100;
        }
    }

多线程类:

    class Demo1
    {
        public void Test()
        {
            TestClass obj = new TestClass();
            Thread t1 = new Thread(obj.MissYou);
            t1.Start();
            Thread t2 = new Thread(obj.MissYou);
            t2.Start();
        }

        static void Main(string[] args)
        {
            Demo1 obj=new Demo1();
            obj.Test();
        }
    }

如果没有lock锁,线程t1和t2会产生死锁,主要是对于公共资源num的占用不当;

解决方式是lock(objLock)使得线程顺序执行,就不存争夺资源的情况,值得注意的是objLock是引用类型object。

 

在很多时候需要同一时间执行多个线程,需要用到一点线程池的知识。

        public void ThreadMerthod(object para)
        {
            Console.WriteLine("开始下载...");
            Thread.Sleep(3000);
            Console.WriteLine("下载完毕...");
        }

        public void Test()
        {
            ThreadPool.QueueUserWorkItem(ThreadMerthod,123);
            ThreadPool.QueueUserWorkItem(ThreadMerthod, 123);
            ThreadPool.QueueUserWorkItem(ThreadMerthod, 123);
            ThreadPool.QueueUserWorkItem(ThreadMerthod, 123);
            ThreadPool.QueueUserWorkItem(ThreadMerthod, 123);
            ThreadPool.QueueUserWorkItem(ThreadMerthod, 123);
            ThreadPool.QueueUserWorkItem(ThreadMerthod, 123);

            Console.ReadLine();
        }

需要注意的是线程池属于后台线程,多用于后台任务,需要加上Console.ReadLine()。

 

任务和任务工厂的例子:

        public void Test2()
        {
            Task ta = new Task(Method2);
            ta.Start();
            Console.ReadLine();
        }

        public void Test3()
        {
            TaskFactory tf = new TaskFactory();
            Task t = tf.StartNew(Method2);
            Console.ReadLine();
        }

任务和线程,任务其实是线程的一个特例,就像事件是委托的一种特殊实例类似,当然在这里的任务和任务工厂都属于后台线程,需要Console.ReadLine()。

转载于:https://www.cnblogs.com/Optimism/p/10505397.html


http://www.niftyadmin.cn/n/4556312.html

相关文章

C#操作文本文件

123 12 1 StringSplitOptions.None);//分成数组你要书一下 用StreamWriter的WriteLine()方法写入 怎么提交了呢- -string[] spliter { "/r/n" };//换行符分割string[] configs configstr.Split(spliter 没答完呢 把这个字符串用Split()方法分割 答案补充 郁闷 把文…

C语言中函数调用与返回值的关系是什么

而函数是负责要做什么 3); //调用函数 3我们称为形式参数 int sum(int arg1 并传递参数3和4过去 函数将计算机过程封装 也就可以说没有返回值 ||| 函数调用和返回值的关系其实和赋值运算的道理是一样的只是 他就返回空 如果没有return语句 如果函数里有return后便那个值就是返回…

【C语言问题】<一个三位数 它的各个数字位的立方和等于它本身 比如:153=1*1*1+5*5*5+3*3*3>用C语言怎么编写

大概意思就是这个 ge; //百 n);} ||| for(i1;i<10;i) for(j1;j<10;j) for(k1;k<10;k) { if(i*i*ij*j*jk*k*ki*100j*10k) printf(数字为&#xff1a;i*100j*10k); }很久没用C了 做repeat次下列运算&#xff1a;输入2 个正整数m和n(1<m &n);for(im;i<n;i){ su…

c大小的程序。 b 怎么用turboC编辑一个比较a

c:temp; printf("%d/n" &b &a temp; printf("请输入a b c:"); scanf("%d %d %d" c b #include <stdio.h>void main(){ int a 就空一格 直接putchar(C); ||| a b c d e f g 嘛 a:b; c c>temp 都看不懂 &c); //第输入完一个…

我想学c语言 大家给个网址

searchc%E8%AF%AD%E8%A8%80%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B&restype-1&id10000000&ty0&pattern0 ||| 去土豆上搜搜吧~上面好多视频教程呢~ 编程爱好者www.programfan.com ||| c语言视频教程http://www.gougou.com/search

探索未知种族之osg类生物---呼吸分解之渲染遍历二

那么今天我们就正式进入osg整个呼吸动作之中最复杂的一个动作&#xff0c;ViewerBase::renderingTraversals()&#xff0c;我们先介绍renderingTraversals的开头的简单的几步操作。 1、这个函数中先遍历了所有的view中的相机节点分别取得他们的位置Translation以及姿态Rotation…

c语言字符编码

其数码取值为0~9 以下各数是合法的十六进制整常数&#xff1a; 0X2A(十进制为42) 0XA0 (十进制为160) 0XFFFF (十进制为65535) 以下各数不是合法的十六进制整常数&#xff1a; 5A (无前缀0X) 0X3H (含有非十六进制数码) ||| /101是 ASCII码 和C165完全不一样C1/101是转义字符 C…