您的位置:首页 > 编程语言

多线程编程——临界区

2016-07-26 23:42 706 查看
1、windows API创建线程

#include <windows.h>								//包含相应头文件
#include <stdio.h>

DWORD WINAPI myfun1(LPVOID lpParameter 	);			//声明线程函数
DWORD WINAPI myfun2(LPVOID lpParameter 	);

int main()											//主函数
{
HANDLE h1,h2;										//定义句柄变量
h1=::CreateThread(NULL,0,myfun1,NULL,0,NULL);		//创建线程1
printf("线程1开始运行!\r\n");						//输出线程1运行信息
h2=::CreateThread(NULL,0,myfun2,NULL,0,NULL);		//创建线程2
printf("线程2开始运行!\r\n");						//输出线程2运行信息
::CloseHandle(h1);									//关闭线程句柄对象
::CloseHandle(h2);
while(1)
{
if(getchar()=='q')								//如果用户输入字符q
{
return 0;										//程序正常退出
}
else												//如果用户输入的字符不是q
{
::Sleep(100);									//程序睡眠
}
}
}

DWORD WINAPI myfun1(LPVOID lpParameter) 			//分别实现线程函数
{
printf("线程1正在运行!\r\n");						//输出信息
return 0;											//正常结束线程函数
}
DWORD WINAPI myfun2(LPVOID lpParameter)
{
printf("线程2正在运行!\r\n");
return 0;
}


2、使用临界区的多线程编程    windows API

#include <windows.h>							//包含头文件
#include <stdio.h>

DWORD WINAPI myfun1(LPVOID lpParameter );//声明线程函数
DWORD WINAPI myfun2(LPVOID lpParameter );

static int a1=0;								//定义全局变量并初始化
CRITICAL_SECTION Section;						//定义临界区对象

int main()										//主函数
{

InitializeCriticalSection(&Section); 			//初始化临界区对象

HANDLE h1,h2;									//定义线程句柄
h1=::CreateThread(NULL,0,myfun1,NULL,0,NULL);	//创建线程1
printf("线程1开始运行!\r\n");
h2=::CreateThread(NULL,0,myfun2,NULL,0,NULL);	//创建线程2
printf("线程2开始运行!\r\n");
::CloseHandle(h1);								//关闭线程句柄对象
::CloseHandle(h2);

::Sleep(10000);									//程序睡眠10秒
printf("正常退出程序请按\r\n");
while(1)
{
if(getchar()=='q')								//如果用户输入字符q
{
DeleteCriticalSection(&Section);			//删除临界区对象
return 0;
}
}
}

DWORD WINAPI myfun1(LPVOID lpParameter) 		//线程函数1
{
while(1)
{
EnterCriticalSection(&Section);			//进入临界区
a1++;										//变量自加
if(a1<10000)								//设置变量a1小于10000
{
//::Sleep(1000);								//程序睡眠1秒
printf("线程1正在计数%d\r\n",a1);
LeaveCriticalSection(&Section);				//离开临界区
}
else										//如果变量大于10000
{
LeaveCriticalSection(&Section);			//离开临界区
break;									//跳出循环
}
}
return 0;
}
DWORD WINAPI myfun2(LPVOID lpParameter) 		//线程函数2
{
while(1)
{
EnterCriticalSection(&Section);		//进入临界区
a1++;
if(a1<10000)
{
//::Sleep(1000);							//程序睡眠1秒
printf("线程2正在计数%d\r\n",a1);
LeaveCriticalSection(&Section);				//离开临界区
}
else
{
LeaveCriticalSection(&Section);
break;
}
}
return 0;									//线程函数返回0
}


3、使用临界区的多线程编程   MFC类


#include <stdio.h>
#include <afxmt.h>

DWORD WINAPI myfun1(LPVOID lpParameter);	//声明线程函数
DWORD WINAPI myfun2(LPVOID lpParameter);
CCriticalSection m_Sec;									//定义全局变量m_Sec
int a=0;
//定义全局变量a
int main()
{
HANDLE h1,h2;											//定义线程句柄
h1=::CreateThread(NULL,0,myfun1,NULL,0,NULL);			//创建线程1
printf("线程1开始运行!\r\n");
h2=::CreateThread(NULL,0,myfun2,NULL,0,NULL);			//创建线程2
printf("线程2开始运行!\r\n");
::CloseHandle(h1);										//关闭线程句柄对象
::CloseHandle(h2);
::Sleep(10000);											//程序睡眠10秒
return 0;
}
DWORD WINAPI myfun1(LPVOID lpParameter) 				//线程函数1
{
m_Sec.Lock();										//锁定临界区
a+=1;													//变量加1
printf("%d\n",a);										//输出变量
m_Sec.Unlock();								//对临界区进行解锁
return 0;
}
DWORD WINAPI myfun2(LPVOID lpParameter) 		//线程函数2
{
m_Sec.Lock();								//锁定临界区
a+=1;											//变量加1
printf("%d\n",a);								//输出变量
m_Sec.Unlock();								//对临界区进行解锁
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 编程 windows api