linux多线程在Linux系统中多进程程序结构和多线程结构那个好?

linux多线程  时间:2020-12-27  阅读:()

浅谈linux 多线程编程和 windows 多线程编程的异同

转载自fychit创意空间 很早以前就想写写linux下多线程编程和windows下的多线程编程了,但是每当写时又不知道从哪个地方写起,怎样把自己知道的东西都写出来,下面我就谈谈linux多线程及线程同步,并将它和windows的多线程进行比较,看看他们之间有什么相同点和不同的地方。

其实最开始我是搞windows下编程的,包括windows编程,windows 驱动,包括usb驱动,ndis驱动,pci驱动,1394驱动等等,同时也一条龙服务,做windows下的应用程序开发,后面慢慢的我又对linux开发产生比较深的兴趣和爱好,就转到搞linux开发了。

在接下来的我还会写一些博客,主要是写linux编程和windows编程的区别吧,现在想写的是linux下usb驱动和windows下usb驱动开发的区别,这些都是后话,等我将linux多线程和windows多线程讲解完后,我再写一篇usb驱动,谈谈windows 和linux usb驱动的东东。

好了,言归正传。

开始将多线程了。

首先我们讲讲为什么要采用多线程编程,其实并不是所有的程序都必须采用多线程,有些时候采用多线程,性能还没有单线程好。

所以我们要搞清楚,什么时候采用多线程。

采用多线程的好处如下: (1)因为多线程彼此之间采用相同的地址空间,共享大部分的数据,这样和多进程相比,代价比较节俭,因为多进程的话,启动新的进程必须分配给它独立的地址空间,这样需要数据表来维护代码段,数据段和堆栈段等等。

(2)多线程和多进程相比,一个明显的优点就是线程之间的通信了,对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。

但是对于多线程就不一样了。

他们之间可以直接共享数据,比如最简单的方式就是共享全局变量。

但是共享全部变量也要注意哦,呵呵,必须注意同步,不然后果你知道的。

呵呵。

(3)在多cpu的情况下,不同的线程可以运行不同的cpu下,这样就完全并行了。

反正我觉得在这种情况下,采用多线程比较理想。

比如说你要做一个任务分2个步骤,你为提高工作效率,你可以多线程技术,开辟2个线程,第一个线程就做第一步的工作,第2个线程就做第2步的工作。

但是你这个时候要注意同步了。

因为只有第一步做完才能做第2步的工作。

这时,我们可以采用同步技术进行线程之间的通信。

针对这种情况,我们首先讲讲多线程之间的通信,在windows平台下,多线程之间通信采用的方法主要有: (1)共享全局变量,这种方法是最容易想到的,呵呵,那就首先讲讲吧,比如说吧,上面的问题,第一步要向第2步传递收据,我们可以之间共享全局变量,让两个线程之间传递数据,这时主要考虑的就是同步了,因为你后面的线程在对数据进行操作的时候,你第一个线程又改变了数据的内容,你不同步保护,后果很严重的。

你也知道,这种情况就是读脏数据了。

在这种情况下,我们最容易想到的同步方法就是设置一个bool flag了,比如说在第2个线程还没有用完数据前,第一个线程不能写入。

有时在2个线程所需的时间不相同的时候,怎样达到最大效率的同步,就比较麻烦了。

咱们可以多开几个缓冲区进行操作。

就像生产者消费者一样了。

如果是2个线程一直在跑的,由于时间不一致,缓冲区迟早会溢出的。

在这种情况下就要考虑了,是不让数据写入还是让数据覆盖掉老的数据,这时候就要具体问题具体分析了。

就此打住,呵呵。

就是用bool变量控制同步,linux 和windows是一样的。

既然讲道了这里,就再讲讲其它同步的方法。

同样 针对上面的这个问题,共享全局变量同步问题。

除了采用bool变量外,最容易想到的方法就是互斥量了。

呵呵,也就是传说中的加锁了。

windows下加锁和linux下加锁是类似的。

采用互斥量进行同步,要想进入那段代码,就先必须获得互斥量。

linux上互斥量的函数是: windows下互斥量的函数有:createmutex 创建一个互斥量,然后就是获得互斥量waitforsingleobject函数,用完了就释放互斥量ReleaseMutex(hMutex),当减到0的时候 内核会才会释放其对象。

下面是windows下与互斥的几个函数原型。

HANDLE WINAPI CreateMutex( __in LPSECURITY_ATTRIBUTES lpMutexAttributes, __in BOOL bInitialOwner, __in LPCTSTR lpName ); 可以可用来创建一个有名或无名的互斥量对象 第一参数 可以指向一个结构体SECURITY_ATTRIBUTES 一般可以设为null; 第二参数 指当时的函数是不是感应感应状态 FALSE为当前拥有者不会创建互斥 第三参数 指明是否是有名的互斥对象 如果是无名 用null就好。

DWORD WINAPI WaitForSingleObject( __in HANDLE hHandle, __in DWORD dwMilliseconds ); 第一个是 创建的互斥对象的句柄。

第二个是 表示将在多少时间之后返回 如果设为宏INFINITE 则不会返回 直到用户自己定义返回。

对于linux操作系统,互斥也是类似的,只是函数不同罢了。

在linux下,和互斥相关的几个函数也要闪亮登场了。

pthread_mutex_init函数:初始化一个互斥锁; pthread_mutex_destroy函数:注销一个互斥锁; pthread_mutex_lock函数:加锁,如果不成功,阻塞等待; pthread_mutex_unlock函数:解锁; pthread_mutex_trylock函数:测试加锁,如果不成功就立即返回,错误码为EBUSY; 至于这些函数的用法,google上一搜,就出来了,呵呵,在这里不多讲了。

windows下还有一个可以用来保护数据的方法,也是线程同步的方式 就是临界区了。

临界区和互斥类似。

它们之间的区别是,临界区速度快,但是它只能用来同步同一个进程内的多个线程。

临界区的获取和释放函数如下: EnterCriticalSection() 进入临界区; LeaveCriticalSection()离开临界区。

对于多线程共享内存的东东就讲到这里了。

(2)采用消息机制进行多线程通信和同步,windows下面的的消息机制的函数用的多的就是postmessage了。

Linux下的消息机制,我用的较少,就不在这里说了,如果谁熟悉的,也告诉我,呵呵。

(3)windows下的另外一种线程通信方法就是事件和信号量了。

同样针对我开始举得例子,2个线程同步,他们之间传递信息,可以采用事件(Event)或信号量(Semaphore),比如第一个线程完成生产的数据后,就必须告诉第2个线程,他已经把数据准备好了,你可以来取走了。

第2个线程就把数据取走。

呵呵,这里可以采用消息机制,当第一个线程准备好数据后,就直接postmessage给第2个线程,按理说采用postmessage一个线程就可以搞定这个问题了。

呵呵,不是重点,省略不讲了。

对于linux,也有类似的方法,就是条件变量了,呵呵,这里windows和linux就有不同了。

要特别讲讲才行。

对于windows,采用事件和信号量同步时候,都会使用waitforsingleobject进行等待的,这个函数的第一个参数是一个句柄,在这里可以是Event句柄,或Semaphore句柄,第2个参数就是等待的延迟,最终等多久,单位是ms,如果这个参数为INFINITE,那么就是无限等待了。

释放信号量的函数为ReleaseSemaphore();释放事件的函数为SetEvent。

当然使用这些东西都要初始化的。

这里就不讲了。

Msdn一搜,神马都出来了,呵呵。

神马都是浮云! 对于linux操作系统,是采用条件变量来实现类似的功能的。

Linux的条件变量一般都是和互斥锁一起使用的,主要的函数有: pthread_mutex_lock , pthread_mutex_unlock, pthread_cond_init pthread_cond_signal pthread_cond_wait pthread_cond_timewait

Linux下多线程的如何执行?

主线程结束,则进程结束,属于该进程的所有线程都会结束,可以在主线程中join,也可以在主线程中加死循环。

Linux下多线程和多进程程序的优缺点,各个适合什么样的业务场景

IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。

进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。

当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点。

这应该是情有可原的,毕竟unix家族都是从多进程过来的,而 windows从头就是多线程的。

  如果是UNIX/linux环境,采用多线程没必要。

  多线程比多进程性能高?误导!   应该说,多线程比多进程成本低,但性能更低。

  在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。

内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。

  多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。

  多线程是平面交通系统,造价低,但红绿灯太多,老堵车。

  我们现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车。

  高性能交易服务器中间件,如TUXEDO,都是主张多进程的。

实际测试表明,TUXEDO性能和并发效率是非常高的。

TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考意义。

  多线程的优点:   无需跨进程边界; 程序逻辑和控制方式简单; 所有线程可以直接共享内存和变量等; 线程方式消耗的总资源比进程方式好; 多线程缺点:   每个线程与主程序共用地址空间,受限于2GB地址空间; 线程之间的同步和加锁控制比较麻烦; 一个线程的崩溃可能影响到整个程序的稳定性; 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数; 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU   多进程优点:   每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系; 通过增加CPU,就可以容易扩充性能; 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系; 每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大 多线程缺点:   逻辑控制复杂,需要和主程序交互; 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算 多进程调度开销比较大; 最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。

当然你也可以利用多线程+多CPU+轮询方式来解决问题……   方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。

在Linux系统中多进程程序结构和多线程结构那个好?

多进程程序结构和多线程程序结构有很大的不同,多线程程序结构相对于多进程程序结构有以下的优势: 1、方便的通信和数据交换 线程间有方便的通信和数据交换机制。

对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。

线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。

2、更高效的利用CPU 使用多线程可以加快应用程序的响应。

这对图形界面的程序尤其有意义,假如一个操作耗时很长,那么整个系统都会等它操作,此时程序不会响应键盘、鼠标、菜单等操作,而使用多线程技术,将耗时长的操作置于一个新的线程,就可以避免这种尴尬情况的发生。

同时多线程使多CPU系统更加有效。

操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。

具体可以看ZLG的《嵌入式Linux开发教程》上册。

OneTechCloud香港/日本/美国CN2 GIA月付9折季付8折,可选原生IP或高防VPS

OneTechCloud(易科云)是一家主打CN2等高端线路的VPS主机商家,成立于2019年,提供的产品包括VPS主机和独立服务器租用等,数据中心可选美国洛杉矶、中国香港、日本等,有CN2 GIA线路、AS9929、高防、原生IP等。目前商家针对全场VPS主机提供月付9折,季付8折优惠码,优惠后香港VPS最低季付64元起(≈21.3元/月),美国洛杉矶CN2 GIA线路+20Gbps防御型VPS...

RackNerd($199/月),5IP,1x256G SSD+2x3THDD

我们先普及一下常识吧,每年9月的第一个星期一是美国劳工节。于是,有一些服务商会基于这些节日推出吸引用户的促销活动,比如RackNerd有推出四款洛杉矶和犹他州独立服务器,1G带宽、5个独立IP地址,可以配置Windows和Linux系统,如果有需要独立服务器的可以看看。第一、劳工节促销套餐这里有提供2个套餐。两个方案是选择犹他州的,有2个方案是可以选择洛杉矶机房的。CPU内存SSD硬盘配置流量价格...

Hosteons - 限时洛杉矶/达拉斯/纽约 免费升级至10G带宽 低至年$21

Hosteons,一家海外主机商成立于2018年,在之前还没有介绍和接触这个主机商,今天是有在LEB上看到有官方发送的活动主要是针对LEB的用户提供的洛杉矶、达拉斯和纽约三个机房的方案,最低年付21美元,其特点主要在于可以从1G带宽升级至10G,而且是免费的,是不是很吸引人?本来这次活动是仅仅在LEB留言提交账单ID才可以,这个感觉有点麻烦。不过看到老龚同学有拿到识别优惠码,于是就一并来分享给有需...

linux多线程为你推荐
域名备案查询如何查询自己域名是否备案,怎么查询备案号?vpsvps是什么?com域名空间域名和空间是什么意思网站空间价格域名空间一般几钱?什么是虚拟主机虚拟主机是什么?100m虚拟主机100M虚拟主机有多大,能放多少东西虚拟主机控制面板虚拟主机控制面板是什么?万网虚拟主机如何购买万网的虚拟主机?美国虚拟主机购买美国虚拟主机在国内那家卖的便宜,稳定,功能全??虚拟主机测评虚拟主机怎么看好坏!!!!
二级域名 免费域名注册网站 万网域名管理 国内免备案主机 adman oneasiahost 哈喽图床 360抢票助手 台湾谷歌网址 空间出租 linux服务器维护 33456 in域名 海外空间 中国linux 阿里云邮箱登陆地址 广东服务器托管 开心online 亿库 .htaccess 更多