Windows编程基础 第十五章 线程局部存储 线程同步 原子锁 临界区 事件 互斥量 信号量 可等候定时器








//TLS线程局部存储的函数实现
//
#include "stdafx.h"
#include "windows.h"
#include "tchar.h"
#include "locale.h"

TCHAR * g_pszText=NULL;
DWORD g_nTlsIndex=0;

VOID  Print()
{
	//_tprintf(TEXT("g_pszText:%s\n"),g_pszText);
	//从指定的TLS索引中获取值
	TCHAR * pszText=(TCHAR *)TlsGetValue(g_nTlsIndex);
	_tprintf(TEXT("TLS:%s\n"),pszText);
}

DWORD WINAPI  PrintProc(LPVOID lpParameter)
{
	TCHAR * pszText=(TCHAR *)lpParameter;
	g_pszText=(TCHAR *)malloc(100);
	_tcscpy(g_pszText,pszText);
	TlsSetValue(g_nTlsIndex,g_pszText);
	while(1)
	{
		Print();
		Sleep(1000);
	}
	return 0;
}

VOID Create()
{
	HANDLE  hTread=NULL;
	DWORD nThreadId=0;

	TCHAR  szText1[]=TEXT("线程1-------------");
	hTread=CreateThread(NULL,0,PrintProc,szText1,0,&nThreadId);

	TCHAR  szText2[]=TEXT("-------------线程2");
	hTread=CreateThread(NULL,0,PrintProc,szText2,0,&nThreadId);

	WaitForSingleObject(hTread,INFINITE);
}


int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL,"zhi");
	//创建TLS索引号
	g_nTlsIndex=TlsAlloc();
	Create();
	//释放TSL索引号
	TlsFree(g_nTlsIndex);
	return 0;
}


// 本程序演示原子锁的使用方式
//
#include "stdafx.h"
#include "windows.h"
#include "tchar.h"
#include "locale.h"

LONG g_lValue1=0;
LONG g_lValue2=0;

DWORD WINAPI  InterProc1(LPVOID lpParameter)
{
	for (int nIndex=0;nIndex<10000000;nIndex++)
	{
		g_lValue1++;
	}
	return 0;
}

DWORD WINAPI  InterProc2(LPVOID lpParameter)
{
	for (int nIndex=0;nIndex<10000000;nIndex++)
	{
		InterlockedIncrement(&g_lValue2);
	}
	return 0;
}

VOID Create()
{
	DWORD wThreadId=0;
	HANDLE hTread[4]={NULL};
	hTread[0]=CreateThread(NULL,0,InterProc1,NULL,0,&wThreadId);
	hTread[1]=CreateThread(NULL,0,InterProc1,NULL,0,&wThreadId);
	hTread[2]=CreateThread(NULL,0,InterProc2,NULL,0,&wThreadId);
	hTread[3]=CreateThread(NULL,0,InterProc2,NULL,0,&wThreadId);
	WaitForMultipleObjects(4,hTread,TRUE,INFINITE);
	//线程1和线程2都执行完毕之后,打印出数值,然后退出
	_tprintf(TEXT("Value1=%d,Value2=%d\n"),g_lValue1,g_lValue2);
}

int _tmain(int argc, _TCHAR* argv[])
{
	Create();
	return 0;
}

//本程序演示临界区的使用方式
//
#include "stdafx.h"
#include "windows.h"
#include "tchar.h"
#include "locale.h"

CRITICAL_SECTION  cs={0};
LONG lValue=0;

VOID Print()
{
	//进入临界区,临界区中可以有多条语句,会作为一个整体执行
	EnterCriticalSection(&cs);
	_tprintf(TEXT("LONG long  long .........\n"));
	lValue++;//这个语句的意思就是说明临界区可以实现原子锁的功能
	LeaveCriticalSection(&cs);
}

DWORD WINAPI PrintProc( LPVOID lpParameter )
{
	while(1)
	{
		Print();
		Sleep(1);
	}
	return 0;
}

VOID Create()
{
	DWORD nThreadID=0;
	HANDLE hThread[2]={0};
	hThread[0]=CreateThread(NULL,0,PrintProc,NULL,0,&nThreadID);
	hThread[1]=CreateThread(NULL,0,PrintProc,NULL,0,&nThreadID);
	getchar();
}

int _tmain(int argc, _TCHAR* argv[])
{
	InitializeCriticalSection(&cs);
	Create();
	DeleteCriticalSection(&cs);
	return 0;
}

//本程序演示事件的使用方式
#include "stdafx.h"
#include "windows.h"
#include "tchar.h"
#include "locale.h"


HANDLE g_hEvent1=NULL;
HANDLE g_hEvent2=NULL;

DWORD WINAPI ThreadSend( LPVOID lpParameter)
{
	while(1)
	{
		SetEvent(g_hEvent1);//触发事件1
		Sleep(500);
		SetEvent(g_hEvent2);//触发事件2
		Sleep(500);
	}
	return 0;
}

DWORD WINAPI ThreadRecv1( LPVOID lpParameter)
{
	while(1)
	{
		WaitForSingleObject(g_hEvent1,INFINITE);
		_tprintf(TEXT("Hello Event :%p\n"),g_hEvent1);
	}
	return 0;
}

DWORD WINAPI ThreadRecv2( LPVOID lpParameter)
{
	while(1)
	{
		WaitForSingleObject(g_hEvent2,INFINITE);
		_tprintf(TEXT("Hello Event :%p\n"),g_hEvent2);
		ResetEvent(g_hEvent2);//因为是手动重置事件,所以要手动的把事件设置成为无信号状态
	}
	return 0;
}


VOID Create()
{
	DWORD wThreadID=0;
	HANDLE  hTread[3]={NULL};
	hTread[0]=CreateThread(NULL,0,ThreadSend,NULL,0,&wThreadID);
	hTread[1]=CreateThread(NULL,0,ThreadRecv1,NULL,0,&wThreadID);
	hTread[2]=CreateThread(NULL,0,ThreadRecv2,NULL,0,&wThreadID);
}


int _tmain(int argc, _TCHAR* argv[])
{
	//创建自动重置事件
	g_hEvent1=CreateEvent(NULL,FALSE,FALSE,NULL);//创建一个自动重置事件,初始信号没有,匿名事件
	//创建一个手动事件
	g_hEvent2=CreateEvent(NULL,TRUE,FALSE,NULL);//创建一个手动重置事件,初始信号没有,匿名事件
	Create();
	getchar();
	CloseHandle(g_hEvent1);
	CloseHandle(g_hEvent2);
	return 0;
}
<pre name="code" class="cpp">//本程序演示互斥量的使用方式
#include "stdafx.h"
#include "windows.h"
#include "tchar.h"
#include "locale.h"


HANDLE g_Mutex=NULL;


DWORD WINAPI ThreadProc1( LPVOID lpParameter)
{
	while(1)
	{
		WaitForSingleObject(g_Mutex,INFINITE);
		_tprintf(TEXT("线程1-------------------------\n"));
		Sleep(500);
		ReleaseMutex(g_Mutex);		
	}
	return 0;
}

DWORD WINAPI ThreadProc2( LPVOID lpParameter)
{
	while(1)
	{
		WaitForSingleObject(g_Mutex,INFINITE);
		_tprintf(TEXT("-------------线程2------------\n"));
		Sleep(500);
		ReleaseMutex(g_Mutex);		
	}
	return 0;
}

DWORD WINAPI ThreadProc3( LPVOID lpParameter)
{
	while(1)
	{
		WaitForSingleObject(g_Mutex,INFINITE);
		_tprintf(TEXT("-------------------------线程3\n"));
		Sleep(500);
		ReleaseMutex(g_Mutex);	
	}
	return 0;
}


VOID Create()
{
	DWORD wThreadID=0;
	HANDLE  hTread[3]={NULL};
	hTread[0]=CreateThread(NULL,0,ThreadProc1,NULL,0,&wThreadID);
	hTread[1]=CreateThread(NULL,0,ThreadProc2,NULL,0,&wThreadID);
	hTread[2]=CreateThread(NULL,0,ThreadProc3,NULL,0,&wThreadID);
}


int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL,"zhi");
	//创建互斥量
	g_Mutex=CreateMutex(NULL,FALSE,NULL);
	Create();
	getchar();
	CloseHandle(g_Mutex);
	return 0;
}

//本程序演示信号量的使用方式
#include "stdafx.h"
#include "windows.h"
#include "tchar.h"
#include "locale.h"
#include "stdio.h"
#include "conio.h"



HANDLE g_hSemphore=NULL;


DWORD WINAPI ThreadSend( LPVOID lpParameter)
{
	while(1)
	{
		TCHAR ch=_getch();
		switch(ch)
		{
		case  '1':
			_tprintf(TEXT("将会打印出一个语句!\n"));
			ReleaseSemaphore(g_hSemphore,1,NULL);
			break;
		case  '5':
			ReleaseSemaphore(g_hSemphore,5,NULL);
			_tprintf(TEXT("将会打印出五个语句!\n"));
			break;
		}
	}
	return 0;
}

DWORD WINAPI ThreadRecv( LPVOID lpParameter)
{
	while(1)
	{
		WaitForSingleObject(g_hSemphore,INFINITE);
		_tprintf(TEXT("Hello Semaphore!\n"));
		Sleep(1000);
	}
	return 0;
}


VOID Create()
{
	DWORD wThreadID=0;
	HANDLE  hTread[2]={NULL};
	hTread[0]=CreateThread(NULL,0,ThreadSend,NULL,0,&wThreadID);
	hTread[1]=CreateThread(NULL,0,ThreadRecv,NULL,0,&wThreadID);
	WaitForMultipleObjects(2,hTread,TRUE,INFINITE);
	
}


int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL,"zhi");
	//创建互斥量
	g_hSemphore=CreateSemaphore(NULL,5,10,NULL);// 初始的时候5个信号量,也就是信号量创建出来的时候就会立刻发出5个信号。
	Create();
	getchar();
	CloseHandle(g_hSemphore);
	return 0;
}


 

//本程序演示可等候定时器的使用方式
#include "stdafx.h"
#include "windows.h"
#include "tchar.h"
#include "locale.h"
#include "stdio.h"
#include "conio.h"



HANDLE g_hTimer=NULL;

VOID CALLBACK TimerAPCProc(LPVOID lpArgToCompletionRoutine,DWORD dwTimerLowValue,DWORD dwTimerHighValue)
{
	_tprintf(TEXT("----------------APC  TIMER  PROC----------\n"));
}


DWORD WINAPI TimerThread( LPVOID lpParameter)
{
	while(1)
	{
		WaitForSingleObject(g_hTimer,INFINITE);
		_tprintf(TEXT("Hello Timer!\n"));
	}
	return 0;
}


VOID Create()
{
	//创建一个定时器
	g_hTimer=CreateWaitableTimer(NULL,FALSE,NULL);
	LARGE_INTEGER  DueTime={0};
	DueTime.QuadPart=-100000000;
	//设置定时器
	SetWaitableTimer(g_hTimer,&DueTime,1000,NULL,NULL,FALSE);
	//创建等候线程	
	DWORD wThreadID=0;
	HANDLE  hTread=NULL;
	hTread=CreateThread(NULL,0,TimerThread,NULL,0,&wThreadID);
	WaitForSingleObject(hTread,INFINITE);
	CloseHandle(hTread);
}

VOID APCTimer()
{
	HANDLE hTimer=CreateWaitableTimer(NULL,FALSE,NULL);
	LARGE_INTEGER  DueTime={0};
	DueTime.QuadPart=-10000;
	SetWaitableTimer(hTimer,&DueTime,1000,TimerAPCProc,NULL,FALSE);
	while (1)
	{
		SleepEx(-1,TRUE);
	}
	CloseHandle(hTimer);
}


int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL,"zhi");
	//Create();
	APCTimer();
	return 0;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值