一文搞定c++多线程同步机制 您所在的位置:网站首页 什么叫线程同步器 一文搞定c++多线程同步机制

一文搞定c++多线程同步机制

2024-07-16 09:08| 来源: 网络整理| 查看: 265

c++多线程同步机制

前序文章:一文搞定c++多线程

同步与互斥

现代操作系统都是多任务操作系统,通常同一时刻有大量可执行实体,则运行着的大量任务可能需要访问或使用同一资源,或者说这些任务之间具有依赖性。

线程同步:线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。例如:两个线程A和B在运行过程中协同步调,按预定的先后次序运行,比如 A 任务的运行依赖于 B 任务产生的数据。线程互斥:线程互斥是指对于共享的操作系统资源,在各线程访问时具有排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许有限的线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。例如:两个线程A和B在运行过程中共享同一变量,但为了保持变量的一致性,如果A占有了该资源则B需要等待A释放才行,如果B占有了该资源需要等待B释放才行。 为什么需要线程同步

​ 由于现在操作系统支持多个线程运行,可能多个线程之间会共享同一资源。当多个线程去访问同一资源时,如果不加以干预,可能会引起冲突。例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数据是经过写线程修改后的。为了确保读线程读取到的是经过修改的变量,就必须在向变量写入数据时禁止其他线程对其的任何访问,直至赋值过程结束后再解除对其他线程的访问限制。这种保证线程能了解其他线程任务处理结束后的处理结果而采取的保护措施即为线程同步。

​ 举个例子,现在你银行卡里有100元,然后一个线程去执行消费,一个线程去执行充值,如果不加以干预,则可能出现这样的情况:消费的线程读取到你的卡里有100元,然后由于线程切换保存了当前的状态就去执行充值线程,充值线程完成充值后你的卡里实际上应该是10000元,然后切换到消费进程,消费进程由于已经读取过卡里的钱所以会直接进行之后的操作,完成后计算得到卡里的钱应该改为50,这便会将你真实的卡里的钱改成50,这当然是我们不希望看到的!如果进行了线程同步操作,当消费线程进行时,由于这是对数据进行写的操作,那么其他充值线程都需要被阻塞直至消费进程结束占据资源,这样便不会导致数据的不一致。

​ 举个代码例子,两个线程对一个共享数据进行++操作并且输出出来,代码如下:

#include #include #include using namespace std; int share = 0; //共享变量 void thread1() { while(share while (share thread task1(thread1); thread task2(thread2); task1.join(); task2.join(); cout mut.lock(); //将互斥锁进行lock share++; cout mut.lock(); //将互斥锁进行lock share++; cout while(share while (share thread task1(thread1); thread task2(thread2); task1.join(); task2.join(); cout EnterCriticalSection(&Critical); if(share>=20) break; share++; cout EnterCriticalSection(&Critical); if (share >= 20) break; share++; cout while(share while (share hEvent = CreateEvent(NULL, FALSE, TRUE, "event"); //创建事件 是自动恢复状态 thread task1(thread1); thread task2(thread2); task1.join(); task2.join(); cout WaitForSingleObject(hSemaphore, INFINITE); //等待信号量为有信号状态 if(share>=20) break; share++; cout WaitForSingleObject(hSemaphore, INFINITE); //等待信号量为有信号状态 if (share >= 20) break; share++; cout while(share while (share hMutex = CreateMutex(NULL, false, "mutex"); //创建互斥对象 thread task1(thread1); thread task2(thread2); task1.join(); task2.join(); cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有