всплывающие блокировки или не потокобезопасны?
-
19-09-2019 - |
Вопрос
Я видел несколько реализаций 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;
Это то, на что это похоже - не потокобезопасная реализация?Или я упускаю что-то очевидное?
Решение
В Реализация GNU libc является потокобезопасным, если libc настроен на повторный вход (что вполне вероятно).Однако это может быть не так для других реализаций libc.
Другие советы
Я не думаю, что вы упускаете что-то очевидное.Я не вижу никаких ссылок на потокобезопасность с popen(), либо требующих, чтобы она была потокобезопасной, либо нет.В результате вам, вероятно, следует рассматривать его как не потокобезопасный.
Не связан с StackOverflow