Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用于(多个)客户端和服务器游戏的共享内存和信号量_C_Multithreading_Synchronization_Semaphore_Shared Memory - Fatal编程技术网

C 用于(多个)客户端和服务器游戏的共享内存和信号量

C 用于(多个)客户端和服务器游戏的共享内存和信号量,c,multithreading,synchronization,semaphore,shared-memory,C,Multithreading,Synchronization,Semaphore,Shared Memory,我必须为C语言的课程编写一个小游戏,它必须使用共享内存、信号量和可以处理多个客户机的客户机/服务器体系结构(游戏的确切要求是2) 这两个客户机需要轮流执行,它们由同一个程序表示(此处不涉及fork()-都是从./client开始的) 服务器启动时必须创建所有资源。所以我的主要问题是关于信号量。(共享内存和游戏逻辑的东西可以工作,或者说并不难实现。) 要确定服务器或客户端是否可以访问共享内存,我需要一个信号量。我需要第二个来决定哪个客户端可以访问。我说得对吗 所以我得到了一个提示,可以通过为客户端

我必须为C语言的课程编写一个小游戏,它必须使用共享内存、信号量和可以处理多个客户机的客户机/服务器体系结构(游戏的确切要求是2)

这两个客户机需要轮流执行,它们由同一个程序表示(此处不涉及fork()-都是从./client开始的)

服务器启动时必须创建所有资源。所以我的主要问题是关于信号量。(共享内存和游戏逻辑的东西可以工作,或者说并不难实现。)

要确定服务器或客户端是否可以访问共享内存,我需要一个信号量。我需要第二个来决定哪个客户端可以访问。我说得对吗

所以我得到了一个提示,可以通过为客户端分配ID来完成。因此,共享内存有三个附加变量,如下所示:

struct game
{
    int id_needed, client_id, id_ready;
    ... // additional stuff that is needed for the game logic itself
};
当服务器启动时,我将一个信号量初始化为0,另一个信号量初始化为1。 当第一个客户端出现时,它检查他的ID是否仍然为0(初始化为零)

如果是,它会尝试以下方法:

while(my_id == 0)
{
   if(semaphore_down(semaphore_1) == 0) // Check if I have access to shared mem
   {
       shared_memory->id_needed = 1;
       if(shared_memory->id_ready == 1)
       {
           my_id = shared_memory->client_id;
           (void) printf("DEBUGGING: My ID is %d\n", my_id);
       }
   }
}
shared_memory->id_needed = 0;
在服务器上我可以

while(1)
{
    if(shared_memory->id_needed = 1)
    {
        (void) printf("DEBUGGING: ID is needed for another client!");
        shared_memory->client_id++;
        shared_memory->id_ready = 1;
        (void) printf("DEBBUGING: Dispatched new ID: %d", shared_memory->client_id);
    }
    // If enough players, start the game ...
}
我真的被困在这里了。服务器只是增加ID(这只是逻辑上的),但我无法解决这个问题

我只想让客户端在共享内存和服务器上交替工作,以检查游戏的值等

我以前从未使用过信号量,我找到的所有文档或示例都只使用一个客户机和一个服务器,但从未使用过多个客户机


请开导我

我看到一件奇怪的事情和两件明显是错误的事情

  • 我看到您显示的代码中的信号量下降,但没有信号量上升
  • 您分配而不是比较:
    if(共享内存->需要的id=1)
  • 即使这是一个比较,它无论如何都是不对的,因为编译器可以自由地对它进行优化。将此变量设置为volatile,以提示编译器变量可以在串行代码流之外更改。或者最好宣布它是原子的

  • 是的,对不起,我忽略了那个。我不得不将所有库调用更改为标准C,因此出现了错误。我在这里使用了一个课程实习生库(不得不),它只是稍微抽象了一下信号量,没有什么特别的。无论如何,我找到了另一个更好的解决办法。