windows api学习笔记-用临界区对象使线程同步

#include <windows.h>
#include <iostream>
#include <process.h>
using namespace std;

int g_nCount1 = 0;
int g_nCount2 = 0;
CRITICAL_SECTION g_cs;//临界区
BOOL g_bContinue = TRUE;//线程结束标志

UINT WINAPI MyThread(LPVOID)
{
	while(g_bContinue)
	{
		::EnterCriticalSection(&g_cs);//如果另一个线程在临界区的话,当前线程会一直等待下去
		g_nCount1++;
		g_nCount2++;
		::LeaveCriticalSection(&g_cs);//把临界区还给Windows
	}
	return 0;
}

int main()
{
	UINT uThreadId;
	HANDLE h[2];
	::InitializeCriticalSection(&g_cs);//临界区初始化
	h[0] = (HANDLE)::_beginthreadex(
		NULL,//线程安全性
		0,//线程堆栈大小
		MyThread,//线程函数的名称
		NULL,//线程函数的参数
		0,//立即启动
		&uThreadId//内核给新生成的线程分配的线程ID
		);
	h[1] = (HANDLE)::_beginthreadex(
		NULL,//线程安全性
		0,//线程堆栈大小
		MyThread,//线程函数的名称
		NULL,//线程函数的参数
		0,//立即启动
		&uThreadId//内核给新生成的线程分配的线程ID
		);
	::Sleep(600);
	g_bContinue = FALSE;
	::WaitForMultipleObjects(
		2,//要等待内核对象的数量
		h,//句柄数组
		TRUE,//是否要等待所有内核对象都成为受信状态
		INFINITE//无限期等待下去
		);
	::CloseHandle(h[0]);
	::CloseHandle(h[1]);
	::DeleteCriticalSection(&g_cs);//删除林界区
	cout<<g_nCount1<<"       "<<g_nCount2<<endl;
	char a;
	cin >> a;

}
时间: 2024-09-24 17:19:33

windows api学习笔记-用临界区对象使线程同步的相关文章

Windows Api学习笔记-动态连接库(DLL)的使用

#include <windows.h> #include <iostream> #include "12dll.h" using namespace std; #pragma comment(lib,"12Dll")//要链接到什么库文件 void main() { //CMy12Dll a; cout<<fnMy12Dll()<<endl; char b; cin>>b; } VS2008 新建WIN3

windows api学习笔记-使用定时器

#include <windows.h> #include "resource.h" #include <string> LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数的函数原型 int APIENTRY WinMain( //APIENTRY是__stdcall的宏定义 HINSTANCE hInstance, //本模块的实例句柄 HINSTANCE hPrevInstance, //

windows api学习笔记-简单的记事本

#include <windows.h> #include "resource.h" #include <string> LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数的函数原型 int APIENTRY WinMain( //APIENTRY是__stdcall的宏定义 HINSTANCE hInstance, //本模块的实例句柄 HINSTANCE hPrevInstance, //

windows api学习笔记-遍历系统进程,获取进程名称和ID(进程快照)

#include <windows.h>//系统会自动连接到指定的库文件lib #include <tlhelp32.h>//声明快照函数的头文件 #include <stdio.h>//std io 标准输入输出接口 #include <iostream> using namespace std; int main() { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); HANDLE hProcessSna

windows api学习笔记-键盘钩子

DLL项目的头文件 #ifdef KEYHOOKLIB_EXPORT //此宏将在CPP文件中定义 #define KEYHOOKLIB_API __declspec(dllexport) #else #define KEYHOOKLIB_API __declspec(dllimport) #endif #define HM_KEY WM_USER+101 BOOL KEYHOOKLIB_API WINAPI SetKeyHook(BOOL bInstall,DWORD dwThreadId =

windows api学习笔记-多线程

#include <windows.h> #include <iostream> using namespace std; DWORD WINAPI ThreadProc(LPVOID lpParam) { int i = 0; while(i<20) { cout<<i<<endl; i++; } return 0; } int main() { HANDLE hThread; DWORD dwThreadId; hThread = ::Create

windows api学习笔记-终止其他进程

#include .h>.h>//系统会自动连接到指定的库文件lib #include .h>.h>//std io 标准输入输出接口 #include using namespace std; int main() { char szCommandLine[] = "cmd"; STARTUPINFO si = {sizeof(si)};// PROCESS_INFORMATION pi; si.dwFlags = STARTF_USESHOWWINDOW;/

核心编程笔记9——内核对象的线程同步2

"信号量内核对象"用于对资源进行计数. 在信号量内核对象内部,和其他内核对象一样,有一个使用计数,该使用计数表示信号量内核对象被打开的次数. 信号量内核对象中还有两个比较重要的数据,分别表示最大资源数和当前资源数.最大资源数表示能够管理的资源的总数,当前资源数表示目前可以被使用的资源数量.   可以使用CreateSeamphore函数来创建一个信号量内核对象,该函数成功返回句柄,失败返回NULL.

Windows录音API学习笔记--转

Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct {     WORD      wMid; 用于波形音频输入设备的设备驱动程序制造商标识符.     WORD      wPid; 声音输入设备的产品识别码.     MMVERSION vDriverVersion; 用于波形音频输入设备的设备驱动程序的版本号.高位字节是主版本号,低字节是次版本号.     CHAR      szPna