简单测试信号量

时间:2013-11-16 23:06:18

标签: unix testing shared-memory semaphore multiprocess

我正在尝试创建一个简单的程序来测试信号量。我正在分配过程并在每个过程的关键部分折磨变量c的值,但c I得到的值仍然是1而不是2.即使mmap()取消注释。任何人都可以向我解释我做错了什么?任何帮助,将不胜感激。我是这方面的新手。非常感谢你的时间。

int main()
{
int c = 0;
  sem_t mutex;
 sem_t mutex1;
 //  sem_t *mutex = (sem_t*)mmap(NULL, sizeof(sem_t*), PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1, 0);
 sem_init(&mutex, 0, 1);
 sem_init(&mutex1, 0, 1);

  pid_t i;
  int id = fork();
 if(id == -1)   {}
  else if(id == 0)
    {
    sem_wait (&mutex);  
   c++;
   sem_post (&mutex);
   }
   else
  {
    sem_wait (&mutex);  
   c++;
   sem_post (&mutex);
   }    
     cout<<c<<endl;
   //system("pause");
   return 0;
    }

我通过制作pshared参数1来尝试另一种方式,但它仍然不起作用。 我也试过它sem_op但它仍然无效。

 int main()
    {


      int c = 0;


           int sid =semget(1105,2, 0666 | IPC_CREAT);


        pid_t i;
      int id = fork();

       if(id == -1)
       {

        }
            else if(id == 0)
           {

                struct sembuf sb;
                sb.sem_num = 0;
                sb.sem_op = -1;
                sb.sem_flg = 0;
                  if((semop(sid, &sb, 1)) == -1)
            cout<<"error"<<endl;

                    c++;

                sb.sem_num = 0;
                sb.sem_op = -1;
                sb.sem_flg = 0;

                      if((semop(sid, &sb, 1)) == -1)
          cout<<"error"<<endl;

         }
         else if(id == 1)
         {

                   struct sembuf sb;

                  if((semop(sid, &sb, 1)) == -1)
            cout<<"error"<<endl;

                    c++;


                     sb.sem_num = 0;
                    sb.sem_op = -1;
                    sb.sem_flg = 0;

                      if((semop(sid, &sb, 1)) == -1)
          cout<<"error"<<endl;

          }

            cout<<c<<endl;

          return 0;

            }

2 个答案:

答案 0 :(得分:1)

如果使用fork(),则必须在分叉进程之间共享信号量。有关详细信息,请参阅sem_init() manual

或者您可以使用命名信号量,有关详细信息,请参阅sem_open()a good article on the subject

答案 1 :(得分:0)

您的主要错误是变量c本身不是共享的 - 每个进程都在其自己的变量副本上运行。你想要这样的东西:

int *c;

c = mmap(NULL, sizeof(*c), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
*c = 0;

// ... later ...
++*c;

此外,关于您的sem_init()示例,您应该:

  • 分配正确大小的共享内存:sizeof(sem_t) sizeof(sem_t*)
  • sem_init()
  • 期间设置 pshared 标志

fork()之后,您可能不需要条件逻辑来区分父与子。毕竟,你希望他们做同样的事情。

(另外,请不要将POSIX信号量命名为“互斥锁”。这个名称会误导匆匆忙忙的POSIX意识的人,他们会认为你指的是另一种同步原语。)

关于您的semget()示例,您似乎在子进程中等待信号量两次(sb.sem_op = -1)。对{} fork()检查父项是不正确的 - 检查返回的PID是否为1(它永远不会出现在典型的UNIX系统上),而不是返回的PID是否为&gt; 0.(同样,你可能不需要让父母和孩子在这里做不同的事情。)