吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3554|回复: 13
收起左侧

[C&C++ 转载] win32多线程实现交替打印A B C

  [复制链接]
aswcy815174418 发表于 2021-5-23 00:56
本帖最后由 aswcy815174418 于 2021-5-23 01:01 编辑

大家可以自己试试实现,得分别用一个线程打印A,B,C
代码:

#include "stdio.h"                
#include <windows.h>                

DWORD WINAPI ThreadA(LPVOID parameter) {
        HANDLE* eventHandle = (HANDLE*)parameter;
        //等待A通知,通知后执行下面代码并修改A为未通知(原因如下)
        //CreateEvent(NULL ,FALSE ,TRUE ,NULL);   第二个参数为FALSE
        WaitForSingleObject(eventHandle[0] ,-1);
        printf("A");
        //设置事件B为已通知,接下来的代码逻辑差不多,就是A->B->C->A.......
        SetEvent(eventHandle[1]);
        return 0;
}

DWORD WINAPI ThreadB(LPVOID parameter) {
        HANDLE* eventHandle = (HANDLE*)parameter;
        WaitForSingleObject(eventHandle[1] ,-1);
        printf("B");
        SetEvent(eventHandle[2]);
        return 0;
}

DWORD WINAPI ThreadC(LPVOID parameter) {
        HANDLE* eventHandle = (HANDLE*)parameter;
        WaitForSingleObject(eventHandle[2] ,-1);
        printf("C\n");
        SetEvent(eventHandle[0]);
        return 0;
}

DWORD WINAPI ThreadCreate(LPVOID parameter) {
        //事件句柄数组
        HANDLE eventHandle[3] = { 0 };
        eventHandle[0] = CreateEvent(NULL ,FALSE ,TRUE ,NULL);
        eventHandle[1] = CreateEvent(NULL ,FALSE ,FALSE ,NULL);
        eventHandle[2] = CreateEvent(NULL ,FALSE ,FALSE ,NULL);
        //线程句柄数组
        HANDLE hThread[3] = { 0 };
        for ( size_t i = 0; i < 10; i++ )                 {
                hThread[0] = CreateThread(0 ,0 ,ThreadA ,(LPVOID)eventHandle ,0 ,0);
                hThread[1] = CreateThread(0 ,0 ,ThreadB ,(LPVOID)eventHandle ,0 ,0);
                hThread[2] = CreateThread(0 ,0 ,ThreadC ,(LPVOID)eventHandle ,0 ,0);
                //等待所有线程跑完
                WaitForMultipleObjects(3,hThread ,TRUE,-1);
                //关闭所有线程句柄
                CloseHandle(hThread[0]);
                CloseHandle(hThread[1]);
                CloseHandle(hThread[2]);
        }
        //关闭所有线程句柄
        CloseHandle(eventHandle[0]);
        CloseHandle(eventHandle[1]);
        CloseHandle(eventHandle[2]);
        return 0;
}

int main(int argc ,char* argv[]) {
        //创建线程避免卡死主线程
        CreateThread(0,0,ThreadCreate,0,0,0);
        //让线程跑一会,直到输入任意字符
        getchar();

        return 0;
}

免费评分

参与人数 3吾爱币 +5 热心值 +3 收起 理由
安道尔的鱼 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
joneqm + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
First丶云心 发表于 2021-5-23 08:56
提示: 作者被禁止或删除 内容自动屏蔽
鸭子咯咯哒~ 发表于 2021-5-23 09:08
ccwjj 发表于 2021-5-23 07:46
haijie1223 发表于 2021-5-23 08:44
千山万水过来支持一下
阳光肥肥 发表于 2021-5-23 14:24
leetcode最近出的多线程的题 可以看看题解
https://leetcode-cn.com/problems/print-in-order/
cdlsz 发表于 2021-5-23 10:58
感谢分享
周留伟 发表于 2021-5-23 11:23
不错,学习一下
prochsh 发表于 2021-5-24 11:37
本帖最后由 prochsh 于 2021-5-24 11:39 编辑

推荐你看看C++11,多线程跟系统无关,提供一个例子,原子操作,不需要添加锁
[C++] 纯文本查看 复制代码
#include <atomic>
#include <thread>
 
atomic<int> a;
atomic<int> b;
 
int Thread1(int) {
	int t = 1;
	a.store(t, memory_order_relaxed);
	b.store(2, memory_order_release);// 本原子操作前所有的写原子操作必须完成
	return 0;
}
 
int Thread2(int) {
	while (b.load(memory_order_acq_rel) != 2); // 本原子操作必须完成才能执行之后所有的读原子操作
	cout << a.load(memory_order_relaxed) << endl;
	return 0;
}
 
int main()
{
	thread t1(Thread1, 0);
	thread t2(Thread2, 0);
	t1.join();
	t2.join();
	return 0;
}
 楼主| aswcy815174418 发表于 2021-5-24 13:19
prochsh 发表于 2021-5-24 11:37
推荐你看看C++11,多线程跟系统无关,提供一个例子,原子操作,不需要添加锁
[mw_shl_code=cpp,true]#incl ...

就最近学到win32api了就来试试
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表