共享内存对象同步

5

我想创建一个简单的井字棋游戏,供SAP系统用户之间玩耍。

我有一个CL_TTT_MANAGER类,其中包含一个注册方法(SIGNUP),用于为游戏分配玩家。我的类是共享内存启用的类,因为其目的是潜在地被所有SAP系统的用户访问。

注册过程使用非常简单的算法完成。

1:存在一个“WAITING_FOR_PLAYERS”标志,最初设置为ABAP_FALSE。 2:当第一个玩家调用“SIGNUP”时,该标志设置为“ABAP_TRUE”。 3:当第二个玩家调用“SIGNUP”时,该标志设置为“ABAP_FALSE”,并创建游戏实例。

我的SIGNUP方法存在问题,即它依赖于状态,即必须记住第一个玩家的名称,并使用私有属性来实现。

对于任何已经处理并发问题的人而言,你会发现存在数据竞争,即如果第二个玩家注册后,第三个玩家也注册了,那么第一个玩家的名称可能会被第三个玩家的名称替换。

我该如何在ABAP中同步这些内容?我有什么机制可以使用?我在文档中没有遇到过这样的情况(我只学习了2个月)。我需要自己实现这个机制吗,还是有一些可用的工具可以帮助我?


嗯,SAP是一家公司(类似于Oracle),ABAP是他们的专有语言(类似Java)......但仅用于编写他们自己系统的程序。 - vlad-ardelean
1个回答

3
这应该不是一个问题 - 在第三个玩家能够写入共享内存区域之前,他必须获得更改句柄,只要第二个用户仍然设置更改锁定,他就无法获得句柄。有关该主题的更详细信息,请参见文档。 请注意,在ABAP环境中实现稳定可靠的共享内存编程是最难完成的任务之一(可能在任何其他环境中也是如此)。我从您的其他问题中了解到您相对较新于ABAP - 这早期开始使用共享对象是雄心勃勃的。

谢谢你提供的信息和建议。目前我自己负责培训,所以在编码过程中可能不知道何时会遇到 ABAP 的问题。 :) - vlad-ardelean
这是一个,相信我。它是一种选择性的地雷区,只会让中央实例开发和测试系统通过,并且只会在具有多个应用服务器的生产环境中引爆。 - vwegert
谢谢你的提醒。我之前没有听说过这个危险,所以我会注意的。你有没有其他关于两个不同用户实例之间通信的建议(除了数据库访问)? - vlad-ardelean
不是真的。你必须滥用某些东西,因为该系统并非为实时交互而设计。 - vwegert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接