线程与线程同步

关于线程的基础知识讲解,这位博主讲的非常好:编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程
(为啥上传图片时,右下角水印会有一个奇怪的qq号?)
(1)WINDOWS下创建线程的几种方式及其区别
相关链接:CreateThread和_beginthread区别及使用;
三种创建线程方法的区别
总结:其实这几种创建线程的方式都是可以的,只不过少数情况下CreateThread不太安全,为了以防外一可以统一使用_beginthread创建线程;并且CreateThread创建的线程要手动关闭线程与句柄;_beginthread内部会自动调用_endthread与CloseHandle关闭线程与句柄;_beginthreadex内部会自动调用 _endthreadex关闭线程,需要手动关闭句柄。

为什么要线程同步?
创建线程是如果不指定优先级,那么多个线程在执行过程中会在同一时刻去抢占CPU运行资源,这样会导致最后的执行结果是乱序的,达不到我们想要的效果,如下:
线程与线程同步心得

(2)多线程同步的问题
WaitForSingleObject函数讲解:WaitForSingleObject函数用法;
WaitForSingleObjec;(比较简单易懂)
讨论:关于WaitForSingleObject信号量的问题
看了很多博客,多线程访问同一个资源时,以前只知道用信号量/互斥量去同步多个线程,但是WaitForSingleObject貌似可以直接用来等待另一个线程结束。
互斥量与信号量的区别
互斥量同步线程
线程与线程同步心得
可以看到,每次有一个线程调用ThrFun()函数时,一开始就将互斥量挂起,此时互斥量处于无信号状态,别的线程调用ThrFun()函数时就会一直被WaitForSingleObject等待着,直到函数结束时才释放互斥量,此时互斥量有了信号,某一个线程的WaitForSingleObject就会去获取这个信号并让线程函数继续执行,其实也就是利用互斥量对整个资源”上锁”,使用完资源再”解锁”,这样子就不会造成线程执行混乱或是死锁。

信号量同步线程
当WaitForSingleObject函数的第一个参数句柄为信号量时并且信号量初始数量为1时,如果多个线程在执行同一个资源函数时,第一个执行函数的线程一旦不释放信号量,那么WaitForSingleObject是不会在等待超时后自动释放信号量的!这样子其他的线程就会无限等待,造成线程死锁!
线程与线程同步心得
注意:(1)信号量的初始数量和最大数量是CreateSemaphore函数的第二个和第三个参数,可以根据需求自行修改。
(2)如果在上述问题中,不手动释放互斥量,那么在等待超时后系统会自动释放互斥量,这也是信号量与互斥量重要的区别之一!
线程与线程同步心得
③ 当WaitForSingleObject函数的第一个参数句柄为thread时,则表示等待这个线程执行结束,再往后执行,有时也可以达到线程同步的效果:
线程与线程同步心得

可以看到结果也是线程同步了,所以WaitForSingleObject的句柄参数为线程时,用法其实与互斥量句柄是一样的,都是等待WaitForSingleObject来获取可以继续执行的信号。

相关文章:

  • 2021-11-20
  • 2021-05-28
  • 2021-12-06
  • 2021-12-30
  • 2021-09-18
  • 2021-06-02
  • 2022-03-06
猜你喜欢
  • 2021-11-18
  • 2021-11-18
  • 2021-09-02
  • 2021-08-12
  • 2022-01-21
  • 2021-09-30
  • 2022-12-23
相关资源
相似解决方案