C++ C++;德克尔';s算法不能正常工作

C++ C++;德克尔';s算法不能正常工作,c++,multiprocessing,C++,Multiprocessing,这真的很困扰我,我真的看不出这段代码有任何错误。。它应该执行五次cout维基百科上的文章解释了你的代码的错误: […]但是请注意,C/C++的“volatile”属性只能保证编译器以正确的顺序生成代码;它不包括必要的内存屏障,以保证该代码的有序执行。C++11原子变量可用于保证适当的排序要求[…] 因此,您必须使用原子变量和原子操作来执行TURN、FLAG_I和FLAG_J,以使其正常工作。另见: 维基百科关于的文章解释了代码的错误: […]但是请注意,C/C++的“volatile”属性

这真的很困扰我,我真的看不出这段代码有任何错误。。它应该执行五次
cout维基百科上的文章解释了你的代码的错误:

[…]但是请注意,C/C++的“volatile”属性只能保证编译器以正确的顺序生成代码;它不包括必要的内存屏障,以保证该代码的有序执行。C++11原子变量可用于保证适当的排序要求[…]

因此,您必须使用原子变量和原子操作来执行
TURN
FLAG_I
FLAG_J
,以使其正常工作。另见:

    • 维基百科关于的文章解释了代码的错误:

      […]但是请注意,C/C++的“volatile”属性只能保证编译器以正确的顺序生成代码;它不包括必要的内存屏障,以保证该代码的有序执行。C++11原子变量可用于保证适当的排序要求[…]

      因此,您必须使用原子变量和原子操作来执行
      TURN
      FLAG_I
      FLAG_J
      ,以使其正常工作。另见:


      谢谢,但已经解决了。。使用
      shmget
      分配内存有问题,必须为每个变量单独设置,并且还添加了一个
      sleep(1)
      in
      get\u out\u of\u critical()
      以便其他进程有足够的时间来注意变量的更改。谢谢,但已经解决了。。使用
      shmget
      分配内存有问题,必须为每个变量单独设置,并且还添加了一个
      sleep(1)
      in
      get\u out\u of\u critical()
      为其他进程留出足够的时间来注意变量的变化。
      #include <signal.h>
      #include <sys/types.h>
      #include <sys/ipc.h>
      #include <sys/shm.h>
      #include <stdlib.h>
      #include <unistd.h>
      #include <iostream>
      using namespace std;
      
      int Id; /* Segment Id */
      int *TURN;
      int *FLAG_I;
      int *FLAG_J;
      
      void get_out_of_critical(int i)
      {
         if(i==0){
            *TURN=1;i=1;
            *FLAG_I=0;
         }
         else{
            *TURN=0;i=0;
            *FLAG_J=0;
         }
      
      }
      
      void get_in_critical(int i)
      {
         if(i==0){
            *FLAG_I=1;
            while(*FLAG_J!=0){
                 if(*TURN==1){
                  *FLAG_I = 0;
                  while(*TURN==1){}
               *FLAG_I=1;
               }
            }
         }
         else{
         *FLAG_J=1;
         while (*FLAG_I!=0){
               if(*TURN==0){
                  *FLAG_J = 0;
                  while(*TURN==0){}
               *FLAG_J=1;
               }
            }
         }
      
      }
      
      void process(int i)
      {
         for(int k=1;k<=5;k++){
             get_in_critical(i);
             for(int m=1;m<=5;m++){
                 cout<<"Process: "<<i+1<<", K.O. num: "<<k<<" ("<<m<<"/5)"<<endl;
                         //sleep(1);
            }
            get_out_of_critical(i);
         }
      }
      
      
      void del(int sig)
      {
         /* free shared memory */
         (void) shmdt((char *) TURN);
         (void) shmdt((char *) FLAG_I);
         (void) shmdt((char *) FLAG_J);
         (void) shmctl(Id, IPC_RMID, NULL);
         exit(0);
      }
      
      int main()
      {
         cout<<endl;
         /* allocating shared memory */
         Id = shmget(IPC_PRIVATE, sizeof(int)*100, 0600);
      
         if (Id == -1)
            exit(1);
      
         TURN = (int *) shmat(Id, NULL, 0);
         *TURN = 0;
         FLAG_I = (int*) shmat(Id, NULL, 0);
         FLAG_J = (int*) shmat(Id, NULL, 0);
         *FLAG_I = 0;
         *FLAG_J = 0;
         sigset(SIGINT, del);// in case of signal interrupt, delete shared memory
      
         /* starting paralel processes */
         if (fork() == 0) {
            process(0);
            exit(0);
         }
         if (fork() == 0) {
            process(1);
            exit(0);
         }
         wait();
         wait();
         del(0);
      
         return 0;
      }