多线程同步——有序打印数字和字符

问题描述:

创建两个线程,一个线程打印1,2,3,……,52,另一个线程打印A,B,C,……,Z。要求打印出来的效果为:

1

2

A

3

4

B

……

51

52

Z

交替有序进行。

这时候需要使用到线程间通信。线程1每次打印2个数字,线程2每次打印1个字母。线程1打印完后,通知线程2,并阻塞等待线程2的通知。线程2打印完后,通知线程1,并阻塞等待线程1的通知......直到打印完成。

#include<Windows.h>
#include<stdio.h>

using namespace std;

DWORD WINAPI printNumbers(LPVOID param);
DWORD WINAPI printCharacters(LPVOID param);

//需要用户自己定义消息的ID
//这个ID必须要大于WM_USER,小于WM_USER的已经被系统占用
#define MY_MSG (WM_USER+1)

//打印的数字和字母
int number = 1;
char ch = 'A';

int main()
{
	//先获取两个线程的ID
	DWORD threadID1 = 0, threadID2 = 0;
	//线程1打印数字
	HANDLE hThread1 = CreateThread(NULL, 0, printNumbers, (LPVOID)&threadID2, 0, &threadID1);
	//线程2打印英文字母
	HANDLE hThread2 = CreateThread(NULL, 0, printCharacters, (LPVOID)&threadID1, 0, &threadID2);
	HANDLE hArr[] = { hThread1 ,hThread2 };
	WaitForMultipleObjects(2, hArr, TRUE, INFINITE);
	return 0;
}

DWORD WINAPI printNumbers(LPVOID param) {
	//传入的参数是线程2的ID
        Sleep(200);//等待线程2创建完成
        DWORD* lpthreadID = (DWORD*)param;
	DWORD threadID2 = *lpthreadID;
	MSG msg;//建立一个消息结构体
	do{
		printf("%d\n", number++);
		printf("%d\n", number++);
		if (number < 53) {
			//给线程2发消息,我已经打印了两个数字
			//消息的内容不重要,就发NULL吧
			PostThreadMessage(threadID2, MY_MSG, NULL, NULL);
		}
		else {
			//因为是线程1先打印完,线程1给线程2发WM_QUIT
			PostThreadMessage(threadID2, WM_QUIT, NULL, NULL);
			break;
		}
	} while (GetMessage(&msg, NULL, 0, 0));
	
	return 0;
}

DWORD WINAPI printCharacters(LPVOID param) {
	//传入的参数是线程1的ID
	DWORD* lpthreadID = (DWORD*)param;
	DWORD threadID1 = *lpthreadID;
	MSG msg;//建立一个消息结构体
	while (GetMessage(&msg, NULL, 0, 0)) {
		//打印一个英文字母
		printf("%c\n", ch++);
		//给线程1发消息,我已经打印了一个英文字母
		//消息的内容不重要,就发NULL吧
		PostThreadMessage(threadID1, MY_MSG, NULL, NULL);
	}
	//GetMessage收到线程1发来的WM_QUIT后,返回false,退出循环
	//注意,这时候Z还没被打印,所以还要打印Z.
	printf("%c\n", ch);
	return 0;
}


这是个比较简单的多线程同步案例,体现了线程间通信的作用。

猜你喜欢

转载自blog.csdn.net/qq_26286193/article/details/80593070
今日推荐