线程线程杂谈(1)

讨论的问题:

网络编程中模型在所难免会遇到这样情况:在线程中需要不断的收取数据并进行处理,对于任何编程语言,如果不用事件、异步、委托等方式处理的,那就只能用查询方式了;如果线程查询中方式没有不阻塞,会出现什么情况?

说明:不阻塞有以下两种含义:

(1) 没有阻塞的意思是把阻塞函数设置成为了非阻塞;

(2)线程中也没有加入延时操作函数进行阻塞;

下面以C#的线程为例:

Thread t = new Thread(new ThreadStart( mainloop));
    t.IsBackground = true;
    t.Start();

private void mainloop()
        {
            while(true)
            {
           ;
             }
               // Thread.Sleep(100);
            }
        }

这样程序就会造成电脑CPU使用率激增,对于单核电脑基本能达到100%;我的PC是4核的,使用立马增到41.9%;造成这样的原因就是程序在空转,由于没有阻塞处理,程序占用了太多的时间片;

如果在循环中加入100ms延时的阻塞会出现什么情况呢:

发现程序CPU的占用率基本就为0%了;

最后:线程死循环+短时间阻塞或者不阻塞什么场景会使用?

(1)不阻塞可以在嵌入式单板中使用,目前着手的项目中有这样程序,并且稳定运行;因为就一个应用程序,这样做也无可厚非;

(2)如果在PC上使用的话,请加上1ms级别的延迟,这样就能把CPU使用率降低下来了;

总结,如果不想使用这种架构,那么就要考虑事件模型了;

时间: 2024-09-30 10:25:32

线程线程杂谈(1)的相关文章

线程系列04,传递数据给线程,线程命名,线程异常处理,线程池

本篇体验:如何传递数据给线程,如何给线程命名,线程的异常处理,线程池.实在是太基础的部分. □ 传递数据给线程 ※ 使用Lambda表达式 class Program { static void Main(string[] args) { Thread t = new Thread(() => Say("hello", "world")); t.Start(); } static void Say(string msg, string msg1) { Cons

线程系列01,前台线程,后台线程,线程同步

在控制台应用程序集中,Main方法开始的是一个线程.如果要再创建线程,需要用到System.Threading这个命名空间. □ 创建第一个线程 using System; using System.Threading; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { var thread = new Thread(DoSth); thread.Start(); } static

死锁现象与解决方案,开启线程的2种方式,守护线程,线程VS进程,线程互斥锁,信号量

死锁现象与解决方案 from threading import Thread,Lock,active_count import time mutexA=Lock() # 锁1 mutexB=Lock() # 锁2 class Mythread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print('%s 拿到A锁' %self.name) mutexB.acquire() print('%

线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i): 3 print(i) 4 if __name__ == '__main__': 5 for i in range(10): 6 t = Thread(target=f1,args=(i,)) 7 t.start() 8 print('主线程') 方式二: 1 from threading im

C#线程 线程进阶

第四部分:高级线程 非阻塞同步 前面我们说过,即使在分配或增加字段的简单情况下,也需要同步.尽管锁定始终可以满足此需求,但是竞争性锁定意味着线程必须阻塞,从而遭受上下文切换的开销和调度的延迟,这在高度并发且对性能至关重要的情况下是不希望的. .NET Framework的非阻塞同步结构可以执行简单的操作,而无需阻塞,暂停或等待. 正确编写非阻塞或无锁的多线程代码非常棘手!特别是,内存障碍很容易出错(volatile关键字甚至更容易出错).在解除普通锁之前,请仔细考虑是否真的需要性能优势.请记住,

进程/线程/线程安全/静态类 杂谈

进程 是应用程序的一个实例要使用的资源的一个集合,每个进程都被赋予了一个虚拟空间,以确保另一个其它进程无法访问. 进程在者创建时需要分配大量的内存并且初始化加载EXE以及大量的DLL资源. 线程 相当于逻辑CPU用以解决进程长时间占用资源的问题,在创建时被分配大约1M的内存.线程以CPU时间片单位运行,当时间片到期后自动切换到另一个线程执行,从而缓解一个进程或线程长期占用资源的情况.线程切换伴随着上下文资源的切换,所以大量的线程切换也是浪费性能的事情. 一个进程拥有一个专用线程,理论上有多少进程

Java线程:线程的同步与锁

1.同步和锁 java中每个对象都有一个内置锁,程序执行非静态的synchronized同步方法时,自动获得执行该方法的对象有关的锁. 一个对象只有一个锁,当一个线程获得锁,其他线程不能进入该对象上的synchronized方法或代码块.直到锁被释放. 线程可以有多个锁,例如,一个对象的同步方法中调用另一个对象的同步方法 2.静态方法的同步 同步静态方法,用的是类对象的锁,即xx.class. 3.线程安全类 对类中的方法进行了同步,但操作这个类时仍然不一定安全. 例如: public  cla

python开发线程:线程&守护线程&全局解释器锁

一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.html?highlight=threading# 二 开启线程的两种方式 #方式一 from threading import Thread import time def sayhi(name): time.sleep(2) print('%s

用户空间实现线程 内核实现线程 线程的调度

http://blog.csdn.net/lujiandong1/article/details/44726373 1.在用户空间中实现线程 (1)特点:把整个线程包放在用户空间,内核对线程包一无所知.从内核角度考虑,就是按正常的方式管理,即单线程进程(存在运行时系统) (2)优点: 1.用户级线程包可以在不支持线程的操作系统上实现. 2.线程切换至少要比陷入内核要快一个数量级.在线程完成运行时,它调用thread_yield可以把该线程的信息保存在线程表中:进而,它可以调用线程调度程序来选择另