windows编程点滴(四)之线程的同步
2011-09-04 20:26
274 查看
MSDN -- Synchronization Functions
1. 使用临界区对象(CRITICAL_SECTION)
创建线程 unsigned long _beginthreadex(void *security , unsigned stack_size,
Unsigned(_stdcall *start_address)(void *),void *arglist, unsigned initflag,
Unsigned *thraaddr)
结束线程 void _endthreadex(unsigned retval);
初始化临界区 InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
进入临界区 EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection);
离开临界区 void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
删除临界区 void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
#include <windows.h>
#include <stdio.h>
#include <process.h>
BOOL g_bContinue = TRUE;
int g_nCount1 = 0;
int g_nCount2 = 0;
CRITICAL_SECTION g_cs;
UINT WINAPI ThreadProc(LPVOID lpParam){
while (g_bContinue)
{
EnterCriticalSection(&g_cs);
g_nCount1++;
g_nCount2 ++;
LeaveCriticalSection(&g_cs);
}
return 0;
}
int main(int argc,char *argv[]){
UINT uId;
HANDLE hThreads[2];
//初始化临界区
InitializeCriticalSection(&g_cs);
hThreads[0] = (HANDLE)_beginthreadex(NULL,0,ThreadProc,NULL,0,&uId);
hThreads[1] = (HANDLE)_beginthreadex(NULL,0,ThreadProc,NULL,0,&uId);
Sleep(1000);
g_bContinue = FALSE;
WaitForMultipleObjects(2,hThreads,TRUE,INFINITE);
CloseHandle(hThreads[0]);
CloseHandle(hThreads[1]);
DeleteCriticalSection(&g_cs);
printf("g_nCount1=%d\tg_nCount2=%d\n",g_nCount1,g_nCount2);
return 0;
}
2. 互锁函数
InterlockedIncrement InterlockedDecrement InterlockedExchangAdd InterlockedExchangePointer
函数同步增一、减一
LONG InterlockedIncrement(LONG volatile *Addend);
LongInterlockedDecrement(LONG volatile *Addend);
1. 使用临界区对象(CRITICAL_SECTION)
创建线程 unsigned long _beginthreadex(void *security , unsigned stack_size,
Unsigned(_stdcall *start_address)(void *),void *arglist, unsigned initflag,
Unsigned *thraaddr)
结束线程 void _endthreadex(unsigned retval);
初始化临界区 InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
进入临界区 EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection);
离开临界区 void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
删除临界区 void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
#include <windows.h>
#include <stdio.h>
#include <process.h>
BOOL g_bContinue = TRUE;
int g_nCount1 = 0;
int g_nCount2 = 0;
CRITICAL_SECTION g_cs;
UINT WINAPI ThreadProc(LPVOID lpParam){
while (g_bContinue)
{
EnterCriticalSection(&g_cs);
g_nCount1++;
g_nCount2 ++;
LeaveCriticalSection(&g_cs);
}
return 0;
}
int main(int argc,char *argv[]){
UINT uId;
HANDLE hThreads[2];
//初始化临界区
InitializeCriticalSection(&g_cs);
hThreads[0] = (HANDLE)_beginthreadex(NULL,0,ThreadProc,NULL,0,&uId);
hThreads[1] = (HANDLE)_beginthreadex(NULL,0,ThreadProc,NULL,0,&uId);
Sleep(1000);
g_bContinue = FALSE;
WaitForMultipleObjects(2,hThreads,TRUE,INFINITE);
CloseHandle(hThreads[0]);
CloseHandle(hThreads[1]);
DeleteCriticalSection(&g_cs);
printf("g_nCount1=%d\tg_nCount2=%d\n",g_nCount1,g_nCount2);
return 0;
}
2. 互锁函数
InterlockedIncrement InterlockedDecrement InterlockedExchangAdd InterlockedExchangePointer
函数同步增一、减一
LONG InterlockedIncrement(LONG volatile *Addend);
LongInterlockedDecrement(LONG volatile *Addend);
相关文章推荐
- 线程的同步和异步(转发)
- Thread and Sync In C# (C#中的线程与同步)
- 多线程 不使用同步工具, 手动协调线程依次执行
- 多线程编程(3): 使用互斥锁同步线程
- 多线程编程之四——线程的同步
- Linux多线程——使用信号量同步线程
- 线程间同步工具
- 多线程编程之四——线程的同步
- 线程的同步和通讯泛例
- 生产者与消费者模式(线程的同步与互斥)
- java中线程的同步和死锁案例分析
- 黑马程序员-Java 多线程(二)-线程的同步、死锁、Lock接口
- Windows下线程的同步
- Windows编程--线程和内核对象的同步-等待定时器内核对象
- Java线程同步:synchronized锁住的是代码还是对象
- java线程 同步与异步 线程池
- 转贴:一个简单的C#多线程间同步的例子
- 线程,任务,同步之异步执行和等待线程
- java#3 java线程的同步问题
- Java线程同步(三)