更多C++多线程面试题,见一份多线程面试题及参考答案
题目描述:
问题描述:有4个线程和1个公共的字符数组。线程1的功能就是向数组输出A,线程2的功能就是向字符输出B,线程3的功能就是向数组输出C,线程4的功能就是向数组输出D。要求按顺序向数组赋值ABCDABCDABCD,ABCD的个数由线程函数1的参数指定。[注:C语言选手可使用WINDOWS SDK库函数]
接口说明:
void init(); //初始化函数
void Release(); //资源释放函数
unsignedint__stdcall ThreadFun1(PVOID pM) ; //线程函数1,传入一个int类型的指针[取值范围:1 – 250,测试用例保证],用于初始化输出A次数,资源需要线程释放
unsignedint__stdcall ThreadFun2(PVOID pM) ;//线程函数2,无参数传入
unsignedint__stdcall ThreadFun3(PVOID pM) ;//线程函数3,无参数传入
Unsigned int __stdcall ThreadFunc4(PVOID pM);//线程函数4,无参数传入
char g_write[1032]; //线程1,2,3,4按顺序向该数组赋值。不用考虑数组是否越界,测试用例保证。
实现代码:
#include <windows.h>
#include <process.h>
#include "stdio.h"
#include <iostream>
using namespace std;
const int THREAD_NUM = 4;
HANDLE g_ThreadEvent[THREAD_NUM];
HANDLE g_OK;
unsigned int __stdcall Fun(void *pPM);
string g_write;
//int g_index = 0;
CRITICAL_SECTION g_cs;
int g_loop = 1;
void StartThread();
int main()
{
int innum=4;
while (cin>>innum)
{
g_loop = innum;
StartThread();
g_write.clear();
}
return 0;
}
void StartThread()
{
InitializeCriticalSection(&g_cs);
//1.创建互斥事件
for (int i = 0; i < THREAD_NUM; i++)
{
g_ThreadEvent[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
}
g_OK = CreateEvent(NULL, FALSE, FALSE, NULL);
//2.创建线程
HANDLE hdl[THREAD_NUM];
for (int i = 0; i < THREAD_NUM; i++)
{
hdl[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, (void*)i, 0, NULL);
}
//3.激活线程1
SetEvent(g_ThreadEvent[0]);
//4.等待所有的线程完成赋值
WaitForSingleObject(g_OK, INFINITE);
//g_write[g_index] = '\0';
cout << g_write.c_str() << endl;
//销毁线程
for (int i = 0; i < THREAD_NUM; i++)
{
CloseHandle(hdl[i]);
CloseHandle(g_ThreadEvent[i]);
}
DeleteCriticalSection(&g_cs);
}
unsigned int __stdcall Fun(void *pPM)
{
int num = (int)pPM;
for (int i = 0; i < g_loop;i++)
{
WaitForSingleObject(g_ThreadEvent[num], INFINITE);
EnterCriticalSection(&g_cs);
//printf(" 线程%d正在输入字符%c\n", num + 1, num + 'A');
g_write += num + 'A';
/*if (num+1==THREAD_NUM)
{
printf("\n");
}*/
LeaveCriticalSection(&g_cs);
SetEvent(g_ThreadEvent[(num + 1) % THREAD_NUM]);
}
if (num + 1 == THREAD_NUM)
{
SetEvent(g_OK);
}
return 0;
}