0

0

一个简单的Go模拟——并发问题

PHPz

PHPz

发布时间:2024-02-09 14:10:10

|

721人浏览过

|

来源于stackoverflow

转载

一个简单的go模拟——并发问题

php小编新一为大家带来了一个简单却有趣的Go模拟游戏,名为“并发问题”。这款游戏以并发编程为主题,让玩家在虚拟的世界中体验并发编程的魅力。游戏中,玩家需要通过编写代码来处理多个任务的同时执行,测试自己的并发编程能力。游戏界面简洁明了,操作简单,适合初学者入门,并且还提供了多个难度和挑战模式供玩家选择。无论你是初学者还是有一定经验的开发者,都能在这个模拟游戏中享受到并发编程的乐趣。

问题内容

我是一名来自波兰的学生,这学期我开始了并发编程课程(Go、Ada 以及将来的一些理论和 CSP 语言)。说实话,Golang 看起来很有趣,但我有点困惑最重要的是,根据我的经验,我称自己为低于平均水平的程序员。基本上,我的任务是创建一个模拟,我将这样描述:

  • 有一个 n*m 网格

  • 可以随机产生旅行者,最多 k 个旅行者,每个旅行者都有唯一的 ID(1、2、3 等等,最多 k)

  • 在随机时刻,如果空间空闲(我确定空闲空间为 0),旅行者可以在网格上向上、向左、向右或向下移动

  • 还有一个摄像头,有时会打印网格的当前状态以及最近的移动(尚未实现)

    商易多用户商城
    商易多用户商城

    功能介绍:1. 商品出售包含拍卖模式,一口价模式。2. 全套系统采用淘宝网风格,成熟,简洁大方3. 每个商品支持多张图片上传,可自由设定,满足广大网民的迫切要求4. 商品信息支持 ubb,图文并茂5. 注册用户可参与竞拍,或者拍卖自己的商品6. 拥有会员注册,交易提醒,成交商品确认等邮件发送功能7. 拥有交易双方信用评价的功能,使得交易安全可*,可信度高8. 拥有安全稳定的用户虚拟币平台,可实现商

    下载
  • 非正式地,我听说我应该使用频道,无论这意味着什么

我的想法是创建一个带有 id 和每个旅行者坐标的结构,并将他们的 id 发送到表示移动意愿的通道,然后我会随机选择移动方向。

我对并发有点困惑 - 不仅是我是否以及在哪里应该使用 wgs 和互斥体,而且例如如果我执行 go func(){} 循环应该在内部还是外部。我会非常高兴感谢任何提示、帮助或修复/想法来修复我的代码,因为目前,正如您所猜测的,它无法正常工作(例如,当相机打印网格时,有时会有超过 k 个旅行者,其中多个旅行者共享相同的号码,有时它们似乎消失了)。希望每个人都度过愉快的一天,我真的很感激任何帮助:)

package main;

import(
    "fmt"
    "os"
    "strconv"
    "math/rand"
    //"sync"
    "time"
)

type traveler struct{
    id int;
    x int;
    y int;
}

func main(){

    //command line
    n, err := strconv.Atoi(os.Args[1]);
    m, err := strconv.Atoi(os.Args[2]);
    k, err := strconv.Atoi(os.Args[3]);
    if err != nil{
        panic(err)
        return
    }

    //board
    var grid [][]int;
    grid = make([][]int, n)
    for i:=0; i0 && grid[travelers[i].x-1][travelers[i].y] == 0{
                        grid[travelers[i].x-1][travelers[i].y] = grid[travelers[i].x][travelers[i].y];
                        grid[travelers[i].x][travelers[i].y] = 0;
                        travelers[i].x = travelers[i].x-1;
                        travelers[i].y = travelers[i].y;
                    }
                case 1:
                    if travelers[i].y>0 && grid[travelers[i].x][travelers[i].y-1] == 0{
                        grid[travelers[i].x][travelers[i].y-1] = grid[travelers[i].x][travelers[i].y];
                        grid[travelers[i].x][travelers[i].y] = 0;
                        travelers[i].x = travelers[i].x;
                        travelers[i].y = travelers[i].y-1;
                    }
                case 2:
                    if travelers[i].x

所有的想法都让我有点不知所措——wgs、互斥体、原子等。

解决方法

  • 如果您想同时处理工作(例如拍摄相机快照和移动旅行者可以同时发生),goroutines 是轻量级线程。
  • 通道用于在 Go 例程之间传输数据。
  • 互斥体用于允许 goroutine 在共享数据上添加锁以进行独占数据访问,以避免竞争条件。

话虽这么说:

  • 在一个 goroutine 中运行相机快照,同时让旅行者在另一个 goroutine 中移动,看起来不错。生成 Goroutine 是不必要的,您只需执行一次,因此您可以在主 Goroutine 中执行它。
  • 在您的案例中,渠道没有带来任何好处。您有一个 Goroutine,它生成一条消息并将其通过通道发送到另一个将进行移动的 Goroutine。您可以在单个 goroutine 中按顺序完成所有这些操作,并避免不必要的复杂性。通道对于不同的用例很有用,但在这里它是多余的。
  • 由于您有两个 goroutine 访问共享内存(网格),因此您需要一个互斥体来避免竞争条件。每当其中一个运行时,它必须“锁定”,完成工作,然后“解锁”。另一个 goroutine 将在锁定步骤处阻塞,直到第一个获取锁的 goroutine 解锁。您可以使用读/写锁进一步优化它(仅相机需要读锁,而移动协程需要读/写锁)
  • 如果您想要更多随机性,可以为每个旅行者创建一个 goroutine。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2910

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1736

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1567

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

1120

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1566

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1297

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1669

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1310

2023.11.13

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

31

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.8万人学习

Django 教程
Django 教程

共28课时 | 3.5万人学习

Excel 教程
Excel 教程

共162课时 | 13.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号