关于多线程学习总结(五) 线程池

必须得说点什么

今天在介绍线程池之前,我得来说说上上篇随笔。关于线程的优先级,我们知道在C#中可以设置线程的优先级,使重要的作业可以优先执行,但是这个优先级不是一成不变的,也就是说就算你设置一个线程的优先级非常高,但是也有可能在优先级较低的线程后执行。优先级高不代表就得到了绝对的通行证,给一个例子大家看看:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Thread test1 = new Thread(new ThreadStart(myThread1));
 6             test1.Priority = ThreadPriority.Lowest;
 7             Thread test2 = new Thread(new ThreadStart(myThread2));
 8             test2.Priority = ThreadPriority.Highest;
 9             Thread test3 = new Thread(new ThreadStart(myThread3));
10             test3.Priority = ThreadPriority.Normal;
11             test1.Start();
12             test2.Start();
13             test3.Start();
14             Console.WriteLine("结束");
15             Console.ReadKey();
16         }
17 
18         public static void myThread1()
19         {
20             Console.WriteLine("我的线程1");
21         }
22         public static void myThread2()
23         {
24             Thread.Sleep(5000);
25             Console.WriteLine("我的线程2");
26         }
27         public static void myThread3()
28         {
29             Thread.Sleep(3000);
30             Console.WriteLine("我的线程3");
31         }
32     }

在上面的例子中我们为线程1设置了最低优先级,线程2设置最高优先级,线程3设置中等优先级,然后在在后面三个方法中分别调用Sleep()方法,使其阻塞,最终我们得到的结果如下所示:

结束

我的线程1

我的线程3

我的线程2

看了这个是不是有点感觉了呢?其实在C#中多线程是个挺怪异的东东,它收到多方面因数的影响,从而导致优先级的执行扑朔迷离,每次执行都可能不同。

线程池

其实我看到线程池这个东西,天生就有种恐惧感,总觉得它很神秘,属于深奥的东西,今天小弟还真得探它一探、、、

关于线程池的概念,其实线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程哦,每个线程池都使用默认的堆栈大小,以默认的优先级执行,并处理多线程单元中。

而且我们都知道一个应用程序可以包含多个线程,这么多的线程管理起来很费力,于是线程池的出现可以帮我们解决相关问题。但是有几点我们需要知道哦,线程池这个东东哇也有不好的地方,有些地方还真使用它不合适,这点后面道来。

ThreadPool类

下面来看看MSDN吧,我发现我越来越爱它了,Wonderful

ThreadPool的概念:提供一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。

关于ThreadPool 它有相关的成员

以上线程的成员我们可以没事儿玩一哈:

 1 int x, y,m,n;
 2 ThreadPool.GetMaxThreads(out x, out y);  //检索可以同时处于活动状态的线程池请求的数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。 
 3 Console.WriteLine("第一次调用GetMaxThreads" + x + "----" + y);      //x指最大线程数,y指异步IO最大线程数
 4 ThreadPool.GetMinThreads(out m, out n);  //线程池在新请求预测中维护的空闲线程数
 5 Console.WriteLine("第一次调用GetMinThreads"+m + "----" + m);  //m指最小线程数,n指异步IO最小线程数
 6 ThreadPool.SetMaxThreads(100,1000);
 7 ThreadPool.GetMaxThreads(out x, out y);  //检索可以同时处于活动状态的线程池请求的数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。 
 8 Console.WriteLine("第二次调用GetMaxThreads" + x + "----" + y);      //x指最大线程数,y指异步IO最大线程数
 9 Console.WriteLine("结束");
10 Console.ReadKey();

其实这些东西蛮有意思的,先看看以上代码执行结果:

这段代码执行是没有任何问题的,可是我们改两个地方,如下所示:

1 ThreadPool.SetMaxThreads(100000,1000);
2 ThreadPool.SetMinThreads(3,1000);

大家猜执行的结果是啥?呵呵试试就知道了,你猜的结果很可能都错了,当我们设置最小线程数大于1023时我们再调用GetMaxThreads方法,我们会发现无论如何最大线程数都是1023。为什么会这样?我们都知道线程有利也有弊,弊端在这里就有所体现,过多的线程导致线程间调度过度频繁,导致线程执行的时间比调度的时间还短,同时又占据更多的内存,所以在这里线程池不允许。

结合上面的成员,练习练习,木有错的、、、、

这个不该出现的结尾

其实关于线程池这个还有一些其他的知识木有提到,比如AutoResetEvent啦,ThreadPool.RegisterWaitForSingleObject啦,今天由于不可抗拒的原因到此停笔,貌似看到此处的园友一定觉得好坑,不过没关系啦,不掉进去怎么会知道那有个坑呢?你说是吧,呵呵,对不住了、、、

------如果你觉得此文对你有所帮助,别忘了点击下右下角的推荐咯,谢谢!------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 「posix多线程程序设计」是一本介绍多线程编程的参考书籍,主要针对POSIX线程库进行讲解。该书详细介绍了多线程的基本概念、原理以及使用方法。 首先,该书对多线程编程的概念进行了解释,解释了进程和线程的区别,以及为什么使用多线程编程可以提高程序的并发性和响应性。它还解释了多线程并发访问共享数据时可能出现的问题,如竞态条件和死锁,并提供了如何通过加锁和同步机制保证多线程程序的正确性和可靠性。 接下来,该书详细介绍了POSIX线程库的使用方法。它讲解了如何创建线程,如何传递参数给线程函数,以及如何等待线程的结束。此外,它还介绍了线程的属性和状态管理,如设置线程的调度策略和优先级,以及如何取消和终止线程的执行。 此外,该书还介绍了线程间的通信和同步机制。它详细讲解了互斥锁、条件变量、信号量等线程同步的方法,以及它们的使用场景和注意事项。这些内容对于处理复杂的多线程程序非常重要,可以确保多个线程之间的协调和合作。 最后,该书还提供了一些高级的多线程编程技术,如线程池、读写锁、自旋锁等。这些技术可以进一步提高多线程程序的性能和效率。 总之,「posix多线程程序设计」以简洁明了的方式介绍了多线程编程的基本概念、原理和使用方法,并提供了丰富的示例和案例,非常适合有一定编程基础的读者学习和参考。无论是对于Linux系统下的软件开发还是嵌入式系统开发,该书都是一本很好的学习资料。 ### 回答2: POSIX多线程程序设计是一本经典的编程指南,该书通过深入讲解POSIX线程库提供的各种函数和特性,帮助读者掌握多线程编程的基本原理和技巧。本书主要内容包括线程创建和销毁、线程同步与互斥、线程调度、线程间通信等。 首先,该书详细介绍了线程的概念和原理,让读者对多线程编程有一个清晰的认识。然后,通过实例和案例分析,介绍了线程的创建和销毁过程,以及如何设置线程的属性和优先级。 其次,该书重点讲解了线程同步和互斥的技术,包括使用互斥量、条件变量、读写锁等实现线程之间的同步和协作。读者可以了解到如何避免线程冲突、死锁等问题,并学习到如何正确使用同步机制来提高程序的性能和并发度。 此外,该书还介绍了线程调度的相关知识,包括线程的优先级、调度策略和调度器的工作原理,读者可以学习到如何合理设置线程的优先级,以及如何利用调度器来实现多线程程序的高效运行。 最后,该书还介绍了线程间通信的方法,包括使用信号量、消息队列和共享内存等实现线程之间的数据传递和同步。读者可以学习到如何正确使用这些通信机制,以及如何解决多线程并发访问共享资源的问题。 总的来说,POSIX多线程程序设计是一本全面而详细的多线程编程指南,适合有一定编程基础的读者学习。通过学习这本书,读者可以掌握多线程编程的基本原理和技巧,提高程序的并发性和性能,设计出高效稳定的多线程程序。 ### 回答3: 《POSIX多线程程序设计》是一本经典的关于多线程编程的书籍,这本书涵盖了POSIX标准接口中与多线程编程相关的各种知识和技术。这里给出一个简要的300字总结。 该书首先介绍了多线程的概念,并解释了为什么使用多线程可以提高程序的性能和响应性。接着,作者详细介绍了POSIX标准接口中的线程创建、销毁、同步和通信等基本操作,同时也详细解释了这些操作的使用方法和注意事项。 随后,书中介绍了线程的调度和优先级,包括如何设置线程的优先级和如何控制线程的调度顺序。此外,还讨论了线程的并发性和同步机制,包括互斥量、条件变量和信号量等。这些内容帮助读者理解如何实现线程之间的数据共享和协作。 此外,书中还讨论了线程的取消和分离。取消是指在执行过程中终止一个线程的执行,而分离则是指将线程的执行和资源回收分离开来。这些操作在某些特定的场景下非常有用。 最后,书中通过介绍案例和示例程序,帮助读者进一步理解多线程编程的实际应用。通过实践,读者可以更好地掌握多线程编程的技巧和方法。 总体而言,《POSIX多线程程序设计》是一本系统全面介绍了多线程编程的书籍,适合对多线程有一定基础了解的程序员阅读。通过学习该书,读者可以更好地理解和应用多线程编程技术,提高自己的编程水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值