李白和杜甫共享一个棋盘下象棋。一个叫李白的程序,输出李白走的10步棋。一个杜甫程序,输出杜甫的10步棋,一个裁判程序裁定二者下棋。C++实现信号量及P、V操作。

本文通过一个有趣的棋盘游戏场景,展示了如何使用C++来实现信号量和P、V操作。分别编写了李白和杜甫两个程序,模拟他们交替下棋的过程,同时裁判程序负责裁决每一步棋的合法性,确保并发执行的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

one.cpp

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

#define PROG_NAME "李白"
HANDLE lb_to_cp, cp_to_lb; //声明信号量

void P(HANDLE s)  //P操作
{
    WaitForSingleObject(s, INFINITE);
}
void V(HANDLE s)  //V操作
{
    ReleaseSemaphore(s, 1, NULL );
}

int main()
{
    int i=0;
    HWND hwnd=GetForegroundWindow(); //获取程序窗口句柄
    char acts[][9]={"炮二平五","马二进三","车一进一","车一平六","车六进七","车九进一","炮八进五","炮五进四","车九平六","前车进一","车六平四","车四进六","炮八平五"};

    HANDLE hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE, 0,0x100,"CHESS_BOARD"); //创建共享内存
    LPSTR chess_menu=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0); //进程连接共享内存,得到共享内存首地址
    lb_to_cp=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Global\\lb_to_cp");    //信号量初始化为0
    cp_to_lb=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"Global\\cp_to_lb"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hide17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值