问题描述:
创建两个线程,一个线程打印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; }
这是个比较简单的多线程同步案例,体现了线程间通信的作用。