c++ 多线程编程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c++ 多线程编程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3190字,纯文字阅读大概需要5分钟。
内容图文
创建线程
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 \r\n", n, i);
WriteFile(hFile, str, strlen(str), &dwWrite, nullptr);
printf("Thread%d print : %d \n", 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 \n", 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 \n", 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;
}
内容总结
以上是互联网集市为您收集整理的c++ 多线程编程全部内容,希望文章能够帮你解决c++ 多线程编程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。