我需要创建6个线程来同时执行一个任务(递增/递减一个数字),直到整数变为0。我应该只使用UNIX命令(具体来说是管道),我无法理解管道的工作方式,或者我如何实现此程序。

该整数可以存储在文本文件中。

如果有人可以解释如何实施此程序,我将不胜感激

最佳答案

这本书是正确的,尽管可以用管道保护关键部分,但如何做并不容易。

int *make_pipe_semaphore(int initial_count)
{
   int *ptr = malloc(2 * sizeof(int));
   if (pipe(ptr)) {
       free(ptr);
       return NULL;
   }
   while (initial_count--)
       pipe_release(ptr);
   return ptr;
}

void free_pipe_semaphore(int *sem)
{
    close(sem[0]);
    close(sem[1]);
    free(sem);
}

void pipe_wait(int *sem)
{
    char x;
    read(sem[0], &x, 1);
}

void pipe_release(int *sem)
{
   char x;
    write(sem[1], &x, 1);
}


信号量中的最大可用资源因操作系统而异,但通常至少为4096。这对于保护初始值和最大值均为1的关键部分并不重要。

用法:

/* Initialization section */
int *sem = make_pipe_semaphore(1);



/* critical worker */
{
    pipe_wait(sem);
    /* do work */

    /* end critical section */
    pipe_release(sem);
}

关于c - 结合使用UNIX Pipeline和C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3929365/

10-12 22:07