почему код show write в pipe не гарантирует атомарность? - PullRequest
0 голосов
/ 09 января 2012

Это очень простая программа. Создайте канал, затем форк, используйте канал между родительским и дочерним процессами. и результат показывает, что запись в канал не гарантирует атомарность.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
int main(void)
{
    int pipe_fd[2];
    pid_t pid;
    char r_buf[4096];
    char w_buf[4096*2];
    int writenum;
    int rnum;
    memset(r_buf,0,sizeof(r_buf));  
    if(pipe(pipe_fd)<0)   //create pipe
    {
        printf("pipe create error\n");
        return -1;
    }

    if((pid=fork())==0)         //fork
    {
        close(pipe_fd[1]);
        while(1)
        {
            sleep(1);   
            rnum=read(pipe_fd[0],r_buf,1000);
            printf("child: readnum is %d\n",rnum);
        }
        close(pipe_fd[0]);

        exit(EXIT_SUCCESS);
    }
    else if(pid>0)
    {
        close(pipe_fd[0]);//write
        memset(r_buf,0,sizeof(r_buf));  
        if((writenum=write(pipe_fd[1],w_buf,1024))==-1)
            printf("write to pipe error\n");
        else    
            printf("the bytes write to pipe is %d \n", writenum);
        writenum=write(pipe_fd[1],w_buf,4096);
        close(pipe_fd[1]);
    }
    return EXIT_SUCCESS;
}

result:
the bytes write to pipe 1000
the bytes write to pipe 1000  //show write pipe not atomic
the bytes write to pipe 1000
the bytes write to pipe 1000
the bytes write to pipe 1000
the bytes write to pipe 120  //show write pipe not atomic
the bytes write to pipe 0
the bytes write to pipe 0
......

тогда я хочу спросить, что означает запись atmoic? И почему эта программа показывает это?

Ответы [ 3 ]

2 голосов
/ 09 января 2012

Запись в каналы не более байтов PIPE_BUF должна быть атомарной.Это означает, что если у вас есть несколько процессов, выполняющих одновременную запись в один и тот же канал, если каждый write () имеет не более байтов PIPE_BUF, их содержимое не смешивается, что позволяет вам настроить протокол, чем может иметь несколько пишущих, использующих только одинтруба, если вам больше не нужны записи.

0 голосов
/ 09 января 2012

Ваша программа и ее результаты не показывают, что записи не являются атомарными.Что означает, что записи должны быть атомарными, так это то, что байты, записанные в одном write(), не будут доступны до тех пор, пока не закончится write(), а когда они будут доступны, все из них будут доступны,По сути, если вы можете прочитать любой из байтов вообще, вы можете прочитать все из них.У вас нет , чтобы прочитать их все сразу;вы можете read() выбрать только некоторые из них, а остальные получить позже read().Если есть доступные байты из более чем одного write(), вы можете даже прочитать все байты (которые остались) из одного write(), а некоторые из следующего.Все гарантии атомарности здесь заключаются в том, что вы не сможете read() только некоторые байтов из определенного write(), но не сможете read() остальных, если вы выберете.

Конечно, атомарные записи гарантируются, только если в буфере канала есть место для записанных байтов - но ваша программа не должна достигать предела.

0 голосов
/ 09 января 2012

Узнайте больше об атомарности здесь

Необходимо обеспечить атомарность всей общей структуры данных в многопоточных / процессорных системах.

Есть некоторыехорошие примеры здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...