网站开发文档编写,试玩网站怎么做,网站备案名称的影响,昆明建站网址通俗解释就像上厕所#xff1a; 门锁了#xff0c;就等着#xff0c;等到别人出来了#xff0c;进去锁上#xff0c;然后该干什么干什么#xff0c;干完了#xff0c;把门打开 门没锁#xff0c;就进去#xff0c;锁上#xff0c;然后该干什么干什么#xff0c;干… 通俗解释就像上厕所 门锁了就等着等到别人出来了进去锁上然后该干什么干什么干完了把门打开 门没锁就进去锁上然后该干什么干什么干完了把门打开 -------------------------------------------------- 多线程中用来确保同一时刻只有一个线程操作被保护的数据 InitializeCriticalSection(cs);//初始化临界区 EnterCriticalSection(cs);//进入临界区 //操作数据 MyMoney*10;//所有访问MyMoney变量的程序都需要这样写Enter.. Leave... LeaveCriticalSection(cs);//离开临界区 DeleteCriticalSection(cs);//删除临界区 多个线程操作相同的数据时一般是需要按顺序访问的否则会引导数据错乱无法控制数据变成随机变量。为解决这个问题就需要引入互斥变量让每个线程都按顺序地访问变量。这样就需要使用EnterCriticalSection和LeaveCriticalSection函数。 比如说我们定义了一个共享资源dwTime[100]两个线程ThreadFuncA和ThreadFuncB都对它进行读写操作。当我们想要保证 dwTime[100]的操作完整性即不希望写到一半的数据被另一个线程读取那么用CRITICAL_SECTION来进行线程同步如下 第一个线程函数 DWORD WINAPI ThreadFuncA(LPVOID lp) { EnterCriticalSection(cs); ... // 操作dwTime ... LeaveCriticalSection(cs); return 0; } 写出这个函数之后很多初学者都会错误地以为此时cs对dwTime进行了锁定操作dwTime处于cs的保护之中。一个“自然而然”的想法就是——cs和dwTime一一对应上了。 这么想就大错特错了。dwTime并没有和任何东西对应它仍然是任何其它线程都可以访问的。如果你像如下的方式来写第二个线程那么就会有问题 DWORD WINAPI ThreadFuncB(LPVOID lp) { ... // 操作dwTime ... return 0; } 当线程ThreadFuncA执行了EnterCriticalSection(cs)并开始操作dwTime[100]的时候线程 ThreadFuncB可能随时醒过来也开始操作dwTime[100]这样dwTime[100]中的数据就被破坏了。 为了让CRITICAL_SECTION发挥作用我们必须在访问dwTime的任何一个地方都加上 EnterCriticalSection(cs)和LeaveCriticalSection(cs)语句。所以必须按照下面的 方式来写第二个线程函数 DWORD WINAPI ThreadFuncB(LPVOID lp) { EnterCriticalSection(cs); ... // 操作dwTime ... LeaveCriticalSection(cs); return 0; } 这样当线程ThreadFuncB醒过来时它遇到的第一个语句是EnterCriticalSection(cs)这个语句将对cs变量 进行访问。如果这个时候第一个线程仍然在操作dwTime[100]cs变量中包含的值将告诉第二个线程已有其它线程占用了cs。因此第二个线程的 EnterCriticalSection(cs)语句将不会返回而处于挂起等待状态。直到第一个线程执行了 LeaveCriticalSection(cs)第二个线程的EnterCriticalSection(cs)语句才会返回 并且继续执行下面的操作。 这个过程实际上是通过限制有且只有一个函数进入CriticalSection变量来实现代码段同步的。简单地说对于同一个 CRITICAL_SECTION当一个线程执行了EnterCriticalSection而没有执行LeaveCriticalSection的时 候其它任何一个线程都无法完全执行EnterCriticalSection而不得不处于等待状态。 再次强调一次没有任何资源被“锁定”CRITICAL_SECTION这个东东不是针对于资源的而是针对于不同线程间的代码段的我们能够用它来进 行所谓资源的“锁定”其实是因为我们在任何访问共享资源的地方都加入了EnterCriticalSection和 LeaveCriticalSection语句使得同一时间只能够有一个线程的代码段访问到该共享资源而已其它想访问该资源的代码段不得不等待。 这就是使用一个CRITICAL_SECTION时的情况。你应该要知道它并没有什么可以同步的资源的“集合”。这个概念不正确。 如果是两个CRITICAL_SECTION就以此类推。