【发布时间】:2023-03-24 04:44:01
【问题描述】:
下面我在两个不同的进程中增加一个计数器 1000 并使用全局信号量进行同步。但是iCounter不给我2000?谁能给我解释一下为什么?
#include <stdio.h>
#include <semaphore.h>
#include <stdlib.h>
#include <fcntl.h>
#define SEM_NAME "/sync"
#define NUMBER_OF_PROCESSES 2
int main ()
{
int iCounter = 0;
pid_t pid[NUMBER_OF_PROCESSES];
sem_t *sSem = sem_open (SEM_NAME,O_CREAT | O_EXCL, S_IRWXU | S_IRWXG | S_IRWXO, 1);
int i, iStatus;
for (i = 0; i < NUMBER_OF_PROCESSES; i++)
{
pid[i] = fork ();
if (pid[i] < 0)
{
printf ("Could not create process\n");
exit (1);
}
else if (pid[i] == 0)
{
int i;
for (i = 0; i < 1000; i++)
{
sem_init(sSem, 0, 1);
sem_wait (sSem);
iCounter++;
sem_post (sSem);
}
exit (0);
}
}
for (i = 0; i < NUMBER_OF_PROCESSES; i++)
waitpid (pid[i], &iStatus, WUNTRACED);
printf ("Value of iCounter = %d\n", iCounter);
sem_close (sSem);
sem_unlink (SEM_NAME);
}
【问题讨论】:
-
发布的代码缺少语句:
#include <sys/types.h>和#include <sys/wait.h>函数:waitpid()你的编译器应该已经告诉你这个问题。 -
发布的代码缺少语句:
#include <sys/types.h>和#include <unistd.h>用于函数:fork()。你的编译器应该已经告诉你了。 -
来自
sem_init()手册页:初始化已经初始化的信号量会导致未定义的行为。 实际上,它根本不应该使用,因为你是使用命名信号量。 -
另外,
iCounter不会在您的进程之间共享。 -
第二次运行发布的代码(当第一次执行从未完成并通过
退出时)导致“sem_open failed: File exists”建议删除 | O_EXCL
标签: c concurrency semaphore