线程中的临界区的应用

处理多线程任务时,如果不加临界区,CPU来回切换,导致数据出现错误,所以需要用到临界区。

读者可以把Enter和leave屏蔽了看看什么效果。

 1 // xiancheng.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include <iostream>
 6 #include <Windows.h>
 7 using namespace std;
 8 CRITICAL_SECTION cs;    //一个结构体,两个LONG型,两个HANDLE型,一个ULONG_PTR型.
 9 DWORD WINAPI ThreadProc(LPVOID Param);
10 int m, n;
11 int main()
12 {
13     InitializeCriticalSection(&cs);
14     HANDLE ThreadHandle[10] = { 0 };
15     for (int i = 0; i < 10; i++)
16     {
17         ThreadHandle[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, NULL, 0, NULL);
18     }
19     WaitForMultipleObjects(10, ThreadHandle, TRUE, INFINITE); //TRUE是全部事件都授信了才返回。FALSE一个事件授信才返回。
20     DeleteCriticalSection(&cs);
21     printf("%d %d"\r\n",m,n);
22     return 0;
23 }
24 DWORD WINAPI ThreadProc(LPVOID Param)
25 {
26     EnterCriticalSection(&cs);
27     for (int i = 0; i < 100000000; i++)
28     {
29         m++;
30         n++;
31     }
32     printf("%d %d\r\n", m, n);
33     LeaveCriticalSection(&cs);
34     return 0;
35 }
时间: 2024-12-13 14:53:08

线程中的临界区的应用的相关文章

[转载]DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁

(转载于breaksoftware的csdn博客) 之前的几篇文章已经讲解了在DllMain中创建并等待线程导致的死锁的原因.是否还记得,我们分析了半天汇编才知道在线程中的死锁位置.如果对于缺乏调试经验的同学来说,可能发现这个位置有点麻烦.那么本文就介绍几个例子,它们会在线程明显的位置死锁掉. DLL中的代码依旧简单.它获取叫EVENT的命名事件,然后等待这个事件被激活.激活的操作自然放在线程中.这次我们不用在DLL中创建线程,而是在Exe中创建. switch (ul_reason_for_c

win32多线程 (二)线程同步之临界区 (critical sections)

所谓critical sections 意指一小块“用来处理一份被共享之资源”的程序代码.你可能必须在程序的许多地方处理这一块可共享的资源.所有这些程序代码可以被同一个critical  section 保护起来.为了阻止问题发生,一次只能有一个线程获准进入critical  section 中.critical section 并不是核心对象.使用方法: CRITICAL_SECTION g_section; 1:初始化 InitializeCriticalSection(&g_section

深入分析java线程中的volatile

Volatile关键字 平时在阅读jdk源码的时候,经常看到源码中有写变量被volatile关键字修饰,但是却不是十分清除这个关键字到底有什么用处,现在终于弄清楚了,那么我就来讲讲这个volatile到底有什么用吧. 当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的.可以理解成:对volatile变量所有的写操作都能立刻被其他线程得知.但是这并不代表基于volatile变量的运算在并发下是安

Delphi7从子线程中发送消息到主线程触发事件执行

[转载]Delphi7从子线程中发送消息到主线程触发事件执行 在对数据库的操作时,有时要用一个子线程来进行后台的数据操作.比如说数据备份,转档什么的.在主窗口还能同是进行其它操作.而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上(可视),同时进行日志处理等.我用的是下面的方法: [1]用到的API函数: RegisterWindowsMessage ---------------------- 函数功能:该函数定义一个新的窗口消息,该消息确保在系统中是唯一的.返

Android的post()方法究竟运行在哪个线程中

Android中我们常用的post()方法大致有两种情况: 1.如果post方法是handler的,则Runnable执行在handler依附线程中,可能是主线程,也可能是其他线程 2.如果post方法是View的,则一定是运行在主线程中的,因为所有view都自带一个handler,所有handler都有post方法,所以它的Runnable是运行在主线程中的 例如:Imageview自带一个handler,它有postDelayed方法,由于imageview是主线程上的,所以Runable是

线程中一些常用方法的分析

join() : 在一个线程中调用另一个线程的join(),则当前线程阻塞,让另一个线程先执行后,当前才执行.   根优先级无关. 从某种意义上来说,要两个线程都执行这个方法才有作用 [java] view plain copy package Test1; public class test7 { public static void main(String[] args) throws InterruptedException { MyThread1 mt=new MyThread1();

线程中使用SaveFileDialog不能弹出窗体

在子线程中使用 SaveFileDialog 无法弹出窗体,主要是我们需要用主线程去处理SaveFileDialog , 我们可以将子线程进行如下设置: public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        } private void button1_Click(object sender, EventArgs e)      

线程中锁的使用---Python

1.普通同步 用threading.Lock()创建锁,用acquire()申请锁,每次只有一个线程获得锁,其他线程必须等此线程release()后才能获得锁 RLock允许在同一线程中被多次acquire.而Lock却不允许这种情况.注意:如果使用RLock,那么acquire和release必须成对出现,即同一线程中调用了n次acquire,必须调用n次的release才能真正释放所占用的琐 2.条件同步 Condition(条件变量)通常与一个锁关联.需要在多个Contidion中共享一个

子线程中更新activity

============问题描述============ 问题是这样的: MainActivity.java中有个MainActivity类,Service.java中有个Service类,MyThread.java中有个MyThread类. MainActivity开启Service中的服务,服务中开启MyThread中的线程,而且因为要用到GPS服务,在线程中要用到 locationManager = locManager;context.getMainLooper() 所以现在我想问:1.