`

C++多线程中用临界区控制全局变量的访问冲突问题

阅读更多
困扰了我很长时间的多线程访问全局变量今天终于解决了,所以得记录一下。。控制全局变量的方法很多,有信号量、临界区等。。这里我记录一个用临界区控制访问冲突的例子。。非常好用。。
#include <windows.h>                                      
#include <iostream>
using namespace std;
//首先做两个线程,实现两个线程间的同步 上次是利用互斥对象实现线程间的同步CreateMutex函数和事件对象间的同步CreateEvent函数,这次用关键代码段(临界区对象)来实现
DWORD WINAPI Fun1Proc(LPVOID lpParameter);                                   
DWORD WINAPI Fun2Proc(LPVOID lpParameter);               

int tickets=100;
CRITICAL_SECTION g_cs;                                  //1.定义一个临界区对象

void main()                                              
{
HANDLE hThread1;                                      
HANDLE hThread2;                                    
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);   
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);   
CloseHandle(hThread1);                              
CloseHandle(hThread2);                               


InitializeCriticalSection(&g_cs);                     //2.初始化临界对象
Sleep(4000);                   
DeleteCriticalSection(&g_cs);                         //3.当函数要结束的时候释放所有没有被拥有的临界区对象相关的成员                     
}


DWORD WINAPI Fun1Proc(LPVOID lpParameter)                       
{                                                              


while(TRUE)                                         
{
EnterCriticalSection(&g_cs);                    //4.判断是否有线程在访问公共资源,如果有线程正在访问就,不能执行下面的                                                       
if(tickets>0)
{
Sleep(1);                                     
cout<<"Thread1 sell tickets:"<<tickets--<<endl;
}
else
break;
LeaveCriticalSection(&g_cs);                    //5.执行完代码段的就离开临界区,那么下个线程就可以访问资源了,这就好像我们要用公用电话(共有资源),我们必须先看看电话厅里是否有人,有人就不能此时用,没人就可以用这个资源了
}
//7.注意一定要释放,否则线程2就没有执行的机会 “谁拥有谁释放”
return 0;                                             
}                                                         


DWORD WINAPI Fun2Proc(LPVOID lpParameter)                
{

while(TRUE)                                          
{
EnterCriticalSection(&g_cs);                            
if(tickets>0)
{
Sleep(1);                                    
cout<<"Thread2 sell tickets:"<<tickets--<<endl;
}
else
break;
LeaveCriticalSection(&g_cs);                    //8.我们可以将线程2注释起来看看,运行发现,线程1卖出第100张后不再卖了,其余的都是线程2卖的                        

}
return 0;                                          //6.程序这样执行,同步建立了。没有出现重复和0的票号                     

}  
分享到:
评论

相关推荐

    采用全局变量方式实现多线程的通信

    为避免这种情况,我们需要同步机制,如互斥量(mutex)、临界区(critical section)或信号量(semaphore),来确保一次只有一个线程能访问该全局变量。 在MFC框架中,我们可以使用`CSingleLock`或`CMultiLock`类来...

    c++通过结构体(struct)全局变量在多线程中传递参数

    通过改变全局变量实时改变目标变量的做法,比如这里,楼主也就是我,为了在树莓派上运行一个tcp结构的客户端线程,并通过摄像头线程收集的数据实时的通过tcp客户端线程处理并发回服务端(这是只对两个线程间的数据传递,多...

    多线程同时操作全局变量的出错演示

    然而,多线程编程也带来了一些挑战,尤其是当多个线程同时访问共享资源,如全局变量时,可能会出现竞态条件(Race Condition)和其他并发问题。本文将深入探讨标题“多线程同时操作全局变量的出错演示”所涉及的知识...

    多线程同步(多线程如何访问临界区资源)

    在提供的示例中,"多线程同步(多线程如何访问临界区资源)"演示了如何在多线程环境中使用临界区保护共享资源。首先,定义一个全局或静态变量作为共享资源,然后创建多个线程。每个线程在执行时都会尝试访问这个资源...

    C++多线程临界区

    然而,多线程编程也带来了数据竞争的问题,这时就需要使用到“临界区”来解决。本篇文章将深入探讨在VS2010环境下,C++如何实现多线程中的临界区管理,以及它们对初学者的重要性。 首先,让我们理解什么是临界区。...

    C++中类使用全局变量

    在C++编程语言中,全局变量是在程序的任何作用域之外声明的变量,可以在程序的多个函数或类中被访问。它们在整个程序的生命周期内都存在,从程序开始执行到结束时保持其值。全局变量的使用有其优点,如共享数据和...

    C/C++ 跨文件共享全局变量Demo

    - **线程安全**:在多线程环境中,全局变量的访问需要特别注意同步,否则可能会引发竞态条件。 - **模块化**:全局变量不利于代码的模块化,因为它们在各个模块间耦合度高。 因此,尽管全局变量在某些场景下是必要...

    C++全局变量初始化的一点总结

    C++中的全局变量初始化是一个重要的话题,涉及到程序的正确性和可预测性。全局变量,即具有静态存储期的变量,其生命周期始于程序开始,终于程序结束。本文将深入探讨全局变量初始化的时机、方式以及一些处理特殊...

    C++ 多线程日志记录

    在C++编程中,多线程日志记录是一种常见的需求,特别是在高并发和实时性要求高的系统中。本文将深入探讨如何使用C++实现多线程日志记录,包括涉及的关键概念、技术以及如何通过提供的文件`log.cpp`、`log.h`和`...

    在C/C++项目中使用全局变量的方法

    然而,不当的使用全局变量可能会引入一系列问题,如命名冲突、代码可维护性降低等。因此,了解如何正确地在项目中管理和使用全局变量至关重要。 #### 方法一:通过`.cpp`文件定义和引用全局变量 **定义**:首先在...

    c++多线程编程的十个例子

    在C++编程中,多线程技术是一种强大的工具,它允许程序同时执行多个任务,从而提高了效率和响应性。以下是对“C++多线程编程的十个例子”的详细讲解,这些例子将帮助你在Windows环境下深入理解和应用多线程。 1. **...

    C++多线程编程实战

    C++多线程 windows

    文件打印问题 (c++多线程实现)

    本文将深入探讨“文件打印问题”的多线程实现,这涉及到线程同步和互斥访问资源,以及如何在VC++6.0环境下运行和调试代码。 首先,让我们了解线程的基本概念。线程是程序执行的最小单位,每个线程都有自己的执行...

    c++ 多线程编程之三----线程间通讯

    在多线程编程中,线程间通讯可以使用全局变量、自定义消息等方法来实现。 一、使用全局变量进行通信 在 C++ 中,使用全局变量可以实现线程间通讯。由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故...

    基于VS2010的C++多线程开发Demo

    条件变量可以用来等待特定条件满足,而互斥量用于保证共享资源在同一时刻只被一个线程访问。通过合理使用这些同步机制,可以避免竞态条件,确保程序的正确运行。 “信号挂起”和“唤醒”是线程同步的另一种方式。挂...

    定义全局变量 变量 全局

    在MFC(Microsoft Foundation Classes)框架中,全局变量和函数的使用与标准C++有所不同,因为MFC工程通常由多个文件组成,需要一种方法来在这些文件之间共享数据和功能。这里将介绍两种在MFC工程中定义全局变量和...

    c++多线程源码

    - `std::mutex`是互斥锁,用于保护临界区,确保同一时间只有一个线程可以访问特定资源。例如,`std::mutex m;`定义了一个互斥锁,`m.lock();`和`m.unlock();`用于锁定和解锁。 - 条件变量(`std::condition_...

    C++多线程编程入门教程

    C++多线程编程入门教程 本文将对C++多线程编程进行详细的介绍,从多线程概念的定义到实际的编程实现。同时,文章还将对Linux和Windows平台下的多线程实现进行比较,并提供了相关的示例代码。 一、多线程概念 在...

    C++多线程详解

    在C++编程中,多线程技术是一种强大的工具,它允许程序同时执行多个任务,从而提高了效率和响应性。本文将深入探讨C++中的多线程,并解释如何创建、管理和同步线程,以及讨论相关的重要概念。 首先,C++11引入了...

Global site tag (gtag.js) - Google Analytics