我正在尝试创建一个简单的程序来测试信号量。我正在分配过程并在每个过程的关键部分折磨变量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;
}
答案 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()
在fork()
之后,您可能不需要条件逻辑来区分父与子。毕竟,你希望他们做同样的事情。
(另外,请不要将POSIX信号量命名为“互斥锁”。这个名称会误导匆匆忙忙的POSIX意识的人,他们会认为你指的是另一种同步原语。)
关于您的semget()
示例,您似乎在子进程中等待信号量两次(sb.sem_op = -1
)。对{} fork()
检查父项是不正确的 - 检查返回的PID是否为1(它永远不会出现在典型的UNIX系统上),而不是返回的PID是否为&gt; 0.(同样,你可能不需要让父母和孩子在这里做不同的事情。)