谷歌面试题
有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:
A:1 2 3 4 1 2....
B:2 3 4 1 2 3....
C:3 4 1 2 3 4....
D:4 1 2 3 4 1....
请设计程序。
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string> #include <stack> #include <windows.h> #include <process.h> #include <fstream> using namespace std; HANDLE hThread1; HANDLE hThread2; HANDLE hThread3; HANDLE hThread4; HANDLE hEvent1; HANDLE hEvent2; HANDLE hEvent3; HANDLE hEvent4; char filepath[256]; UINT __stdcall ThreadWrite1(LPVOID lParam) { ofstream * file = (ofstream *)lParam; int n = 10; while(n--) { WaitForSingleObject(hEvent1, INFINITE); int i = 1; *file<<i; ResetEvent(hEvent1); SetEvent(hEvent2); } return 1; } UINT __stdcall ThreadWrite2(LPVOID lParam) { ofstream * file = (ofstream *)lParam; int n = 10; while(n--) { WaitForSingleObject(hEvent2, INFINITE); int i = 2; *file<<i; ResetEvent(hEvent2); SetEvent(hEvent3); } return 1; } UINT __stdcall ThreadWrite3(LPVOID lParam) { ofstream * file = (ofstream *)lParam; int n = 10; while(n--) { WaitForSingleObject(hEvent3, INFINITE); int i = 3; *file<<i; ResetEvent(hEvent3); SetEvent(hEvent4); } return 1; } UINT __stdcall ThreadWrite4(LPVOID lParam) { ofstream * file = (ofstream *)lParam; int n = 10; while(n--) { WaitForSingleObject(hEvent4, INFINITE); int i = 4; *file<<i; ResetEvent(hEvent4); SetEvent(hEvent1); } return 1; } int _tmain(int argc, _TCHAR* argv[]) { ofstream infile; //写文件A.txt hEvent1 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent2 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent3 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent4 = CreateEvent(NULL, TRUE, FALSE, NULL); infile.open("A.txt", ios::binary | ios::app); SetEvent(hEvent1); hThread1 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite1, &infile, 0, NULL); hThread2 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite2, &infile, 0, NULL); hThread3 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite3, &infile, 0, NULL); hThread4 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite4, &infile, 0, NULL); WaitForSingleObject(hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE); WaitForSingleObject(hThread3, INFINITE); WaitForSingleObject(hThread4, INFINITE); infile.close(); CloseHandle(hEvent1); CloseHandle(hEvent2); CloseHandle(hEvent3); CloseHandle(hEvent4); CloseHandle(hThread1); CloseHandle(hThread2); CloseHandle(hThread3); CloseHandle(hThread4); //写文件B.txt hEvent1 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent2 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent3 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent4 = CreateEvent(NULL, TRUE, FALSE, NULL); infile.open("B.txt", ios::binary | ios::app); SetEvent(hEvent2); hThread1 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite1, &infile, 0, NULL); hThread2 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite2, &infile, 0, NULL); hThread3 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite3, &infile, 0, NULL); hThread4 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite4, &infile, 0, NULL); WaitForSingleObject(hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE); WaitForSingleObject(hThread3, INFINITE); WaitForSingleObject(hThread4, INFINITE); infile.close(); CloseHandle(hEvent1); CloseHandle(hEvent2); CloseHandle(hEvent3); CloseHandle(hEvent4); CloseHandle(hThread1); CloseHandle(hThread2); CloseHandle(hThread3); CloseHandle(hThread4); //写文件C.txt hEvent1 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent2 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent3 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent4 = CreateEvent(NULL, TRUE, FALSE, NULL); infile.open("C.txt", ios::binary | ios::app); SetEvent(hEvent3); hThread1 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite1, &infile, 0, NULL); hThread2 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite2, &infile, 0, NULL); hThread3 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite3, &infile, 0, NULL); hThread4 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite4, &infile, 0, NULL); WaitForSingleObject(hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE); WaitForSingleObject(hThread3, INFINITE); WaitForSingleObject(hThread4, INFINITE); infile.close(); CloseHandle(hEvent1); CloseHandle(hEvent2); CloseHandle(hEvent3); CloseHandle(hEvent4); CloseHandle(hThread1); CloseHandle(hThread2); CloseHandle(hThread3); CloseHandle(hThread4); //写文件D.txt hEvent1 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent2 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent3 = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent4 = CreateEvent(NULL, TRUE, FALSE, NULL); infile.open("D.txt", ios::binary | ios::app); SetEvent(hEvent4); hThread1 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite1, &infile, 0, NULL); hThread2 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite2, &infile, 0, NULL); hThread3 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite3, &infile, 0, NULL); hThread4 = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite4, &infile, 0, NULL); WaitForSingleObject(hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE); WaitForSingleObject(hThread3, INFINITE); WaitForSingleObject(hThread4, INFINITE); infile.close(); CloseHandle(hEvent1); CloseHandle(hEvent2); CloseHandle(hEvent3); CloseHandle(hEvent4); CloseHandle(hThread1); CloseHandle(hThread2); CloseHandle(hThread3); CloseHandle(hThread4); return 0; }