2

popen()/ pclose()の実装を見てきました。それらはすべてpidの静的リストを使用し、ロックは使用しませんでした。

static int *pids;
static int fds;

if (!pids) {
        if ((fds = getdtablesize()) <= 0)
            return (NULL);
        if ((pids = malloc(fds * sizeof(int))) == NULL)
            return (NULL);
        memset(pids, 0, fds * sizeof(int));
    }

またはこれ、おそらくNetBSD:

static struct pid {
    struct pid *next;
    FILE *fp;
    pid_t pid;
} *pidlist; 

    /* Link into list of file descriptors. */
    cur->fp = iop;
    cur->pid =  pid;
    cur->next = pidlist;
    pidlist = cur;

それはどのように見えるか-スレッドセーフではない実装ですか?それとも私は明らかな何かを見逃していますか?

4

2 に答える 2

3

私はあなたが明白な何かを見逃しているとは思わない。popen()でのスレッドセーフへの参照は、スレッドセーフである必要があるかどうかに関係なく表示されます。結果として、おそらくスレッドセーフではないものとして扱う必要があります。

于 2009-11-09T17:35:43.203 に答える
3

libcが再入可能になるように構成されている場合(可能性が高い)、GNUlibcの実装はスレッドセーフです。ただし、これはlibcの他の実装には当てはまらない場合があります。

于 2009-11-09T17:43:29.380 に答える