创建线程
HANDLE WINAPI CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程内核对象的安全属性,一般传入NULL表示使用默认设置
SIZE_T dwStackSize, //线程栈空间大小。传入0表示使用默认大小(1MB)
LPTHREAD_START_ROUTINE lpStartAddress, //新线程所执行的线程函数地址,多个线程可以使用同一个函数地址
LPVOID lpParameter, //传给线程函数的参数
DWORD dwCreationFlags, //指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()
LPDWORD lpThreadId); //将返回线程的ID号,传入NULL表示不需要返回该线程ID号
函数返回值:成功返回新线程的句柄,失败返回NULL
线程锁机制
使用临界区变量控制线程同步
// 创建5个线程同时向文件写数据,写数据时其他线程等待
#include "stdafx.h"
#include <Windows.h>
HANDLE hFile = nullptr;
CRITICAL_SECTION cs; // 临界区全局变量
DWORD WINAPI Thread(LPVOID lpParam);
DWORD WINAPI Thread(LPVOID lpParam)
{
int n = (int)lpParam;
DWORD dwWrite;
for (size_t i = 0; i < 10; ++i)
{
EnterCriticalSection(&cs);
// 写文件
char str[512] = {0};
sprintf(str, "Thread%d print : %d
", n, i);
WriteFile(hFile, str, strlen(str), &dwWrite, nullptr);
printf("Thread%d print : %d
", n, i);
LeaveCriticalSection(&cs);
Sleep(1000);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread[5];
// 创建文件
char *szName = "a.txt";
WCHAR name[20] = {0};
MultiByteToWideChar(CP_ACP, 0, szName, strlen(szName) + 1, name, sizeof(name) / sizeof(name[0]));
hFile = CreateFile(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
return 0;
}
// 初始化临界区
InitializeCriticalSection(&cs);
// 创建线程,同时写文件
for (size_t i = 0; i < 5; ++i)
{
hThread[i] = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)Thread, (LPVOID)(i + 1), 0, nullptr);
}
// 等待所有线程结束
WaitForMultipleObjects(5, hThread, TRUE, INFINITE);
// 删除临界区
DeleteCriticalSection(&cs);
// 关闭文件句柄
CloseHandle(hFile);
getchar();
return 0;
}
线程通信Event
多线程通讯,线程1过10秒后激活事件,线程2等待事件激活后执行
#include "stdafx.h"
#include <Windows.h>
DWORD WINAPI ThreadProc1(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);
HANDLE hEvent = nullptr;
HANDLE hThread1 = nullptr;
HANDLE hThread2 = nullptr;
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
for (size_t i = 0; ; ++i)
{
if (i == 10)
{
// 激活事件,设置为有信号
SetEvent(hEvent);
}
printf("[ThreadProc1] : %d
", i);
Sleep(1000);
}
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
// INFINITE等待hEvent激活
if (WAIT_OBJECT_0 == WaitForSingleObject(hEvent,INFINITE))
{
for (size_t i = 0; ; ++i)
{
printf("{ThreadProc2} : %d
", i);
Sleep(1000);
}
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
/**
* HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset, 为TRUE时,需要手动设置为无信号(使用ResetEvent()),为FLASE线程被释放时自动无信号
BOOL bInitialState,初始化状态,当TRUE,初始状态为有信号状态;当FALSE,初始状态为无信号状态
LPCSTR lpName
);
*/
hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
hThread1 = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)ThreadProc1, nullptr, 0, nullptr);
hThread2 = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)ThreadProc2, nullptr, 0, nullptr);
getchar();
return 0;
}