Этот код не является потокобезопасным, не так ли? - PullRequest
2 голосов
/ 11 декабря 2011

Я увидел фрагмент кода, подобный этому, и подумал, является ли он потокобезопасным:

int savedErrno = errno;

//call some function that may modifies errno

if (errno == xxx)
   foo();

errno = savedErrno;

Я не думаю, что это потокобезопасно, я прав?

Но я видел, как люди пишут такой код, поэтому я не уверен ...

Может ли кто-нибудь помочь мне прояснить это, спасибо ...

Ответы [ 2 ]

9 голосов
/ 11 декабря 2011

Каждый поток имеет свою собственную (специфичную для потока) копию errno, поэтому похоже, что она должна быть безопасной.

От man (3) errno:

errno определяетсястандарт ISO C должен быть модифицируемым lvalue типа int и не должен быть явно объявлен;возможно, это макрос.errno является локальным для потока;установка его в одном потоке не влияет на его значение в любом другом потоке.

1 голос
/ 11 декабря 2011

Код использует только errno в одном потоке, фактически код показывает только один поток. Таким образом, этот фрагмент является потокобезопасным.

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