问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

浅谈Linux多线程编程和Windows多线程编程的异同

发布网友 发布时间:2022-04-23 19:51

我来回答

1个回答

热心网友 时间:2022-04-12 23:59

 转载自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
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
妇科的止血药有哪些 妇科用的止血药有哪些 妇科止血药的功效 人艰不拆是啥意思 汉酱51 度酱香型白酒多少钱?味道怎么样? 穿凉鞋可以穿袜子吗?凉鞋发黄怎么变白? 爱奇艺vip投屏限制怎么办 爱奇艺vip投屏视频限制怎么解决 支付宝怎样解除关联的支付宝账号? 剑圣叫什么名字 ...政策?这个政策的目的是什么?会对经济有什么影响? c语言实例,linux线程同步的信号量方式 谢谢 Linux C 工程中有太多线程需要共享数据,怎样保证数据的同步? linux系统下,c语言pthread多线程编程传参问题 Linux C++多线程出错??? linux c 线程间同步(通信)的几种方法 linux下C编程问题,线程 linux c如何调整线程优先级 Linux C 怎么实现两个线程同步读取两个内存的数据? Linux C 写的线程怎么后台运行? 村干部可以收取居间费吗 linux的C语言开线程后如何归还使用的内存 linux下C编程多线程同步和异步的区别,如何能实现程序的同步 政府融资居间费合规吗 linux下C中怎么让才能安全关闭线程 居间就是中介吗?收居间费合法吗? 居间服务费合法吗 linux C线程崩溃的原因!!! 个人收居间费合法吗 孕妇梦见小黑蛇生男生女 私人拿居间费合法吗 林依晨男朋友 林依晨 背后的故事 谁知道郑元畅和林依晨的详细个人资料 关于林依晨的一些问题 郑元畅和林依晨会结婚吗? 林依晨前男友是 林依晨和郑元畅究竟是什么关系啊? 林依晨和郑元畅会在一起吗?黑正妹真的是郑元畅女友吗 林依晨是谁的女朋友?胡歌是谁的男朋友呢?他俩配不配? 吴尊与林依晨的绯闻分别有哪些呀? 林依晨个人档案 林依晨她的男友是谁 林依晨的心路历程? 请问林依晨有没有男朋友?如果有,是谁? 重庆四季花开文化发展有限公司怎么样? 北京四季花开文化传媒有限责任公司怎么样? 地名\四季开花\双喜临门\千里戈壁\巨轮出海\风平浪静\金银铜铁\大江东去\空中霸王\初次见面\空中码头 四季花开的txt全集下载地址 四季花开 (打一中国地名) 四季花开是什么