2013-12-12 5 views
1

Когда я прочиталIs freebsd C crypt() threadsafe?

ОШИБКИ

The crypt() function returns a pointer to static data, and subsequent 
calls to crypt() will modify the same data. Likewise, crypt_set_format() 
modifies static data. 

от: http://www.freebsd.org/cgi/man.cgi?query=crypt&sektion=3

Я был напуган о мне пришлось заблокировать каждый раз, когда я звоню crypt(), но на этот источник (http://pubs.opengroup.org/onlinepubs/009695399/functions/crypt.html)

Я читаю:

Функция crypt() не обязательно должна быть реентерабельной. Функция, которая не требуется быть реентерабельной, не требуется для потоковой защиты.

Что звучит не правдоподобно для меня.

Я имею в виду, как я могу создать воспроизводимый хеш, если другой поток просто помещает значения в поток, которые не принадлежат друг другу?

Правда ли, что эта функция не должна корректно работать в потоковом режиме?

+0

нет, это не потолочный. Так как он использует внутреннюю статическую структуру данных SAME, два потока, называющих crypt() одновременно, начнут обрабатывать данные друг друга. –

ответ

3

Это не поточно-безопасный. Цитата, которую вы нашли, просто заявляет, что разработчикам не требуется, чтобы функция была поточно-безопасной, поэтому это не так. Если вы вызываете его одновременно из нескольких потоков, то будут происходить плохие вещи.

1

Просто ответив на это старое сообщение, чтобы сообщить ему: FreeBSD HEAD (читай: 12.0) предоставит копию crypt_r(), которая является потокобезопасной. Наслаждайтесь!

FreeBSD man page

+0

Не могли бы вы подробнее рассказать об этом. звучит много, но я не понимаю, что вы пытаетесь мне рассказать. – dhein

+0

Я тот, кто добавил эту функцию во FreeBSD. Я сделал некоторый Googling и наткнулся на это сообщение, в частности ссылаясь на FreeBSD (ссылка на справочную страницу). Я думал, что опубликую этот комментарий, чтобы другие знали, кто наткнется на этот пост. –

+0

Ах, действительно! thats perfect :) Если бы вы могли прокомментировать прямую ссылку на страницу руководства, чтобы я отредактировал ее в своем сообщении, или вы можете сделать это самостоятельно, если хотите, этот ответ действительно будет большим вкладом :) – dhein