Я искал какое-то время и еще не нашел окончательного ответа. Единственная ссылка, которую я нашел до сих пор, которая проливает некоторый свет на это, - here.Являются gnu syslog(), openlog() и closelog() потокобезопасными?
ответ
Согласно POSIX Specification syslog(), openlog() и closelog() являются потокобезопасными.
Есть еще одна тема, которая также отвечает на этот вопрос и датируется еще в 2009 году. Вот ссылка syslog_r for Linux?.
(В то время как я работал на этом опыте, @ user3088572 ответил на вопрос. Так как у меня был на полпути полный, я выложу его в любом случае.)
Ответ «Да», но это было определяемой исключительно экспериментами.
Источник
Основного процесс порождает три темы, и ждем, пока все потоки печати разных строк одновременно. Затем через 1 секунду он приказывает всем остановиться и выйти.
#include <pthread.h>
#include <syslog.h>
static int go = 1;
void * routine(void * str)
{
int c = 0;
while(go)
syslog(7, "%d: %s", c++, (char *)str);
}
int main(int argc, char * argv[])
{
pthread_t t1, t2, t3;
char str1[100] = "111111111111111111111111111111111111111111111111111111111\n";
char str2[100] = "222222222222222222222222222222222222222222222222222222222\n";
char str3[100] = "333333333333333333333333333333333333333333333333333333333\n";
openlog("syslog-test", LOG_PID, LOG_USER);
pthread_create(&t1, NULL, &routine, str1);
pthread_create(&t2, NULL, &routine, str2);
pthread_create(&t3, NULL, &routine, str3);
sleep(1);
go = 0; // threads should stop now
// wait for threads to exit
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_join(t3, NULL);
closelog();
return (0);
}
Результаты
Прежде всего, были не ядро не сбрасывает или ошибки сегментации. Так что это хорошо.
Также, наблюдая системные журналы (см. Ниже), мы видим, что ни одно из сообщений не имеет смешанных символов. Каждая строка содержит либо 1
, либо 2
, либо 3
.
$ tail /var/log/syslog
Dec 18 16:44:18 mach99 syslog-test[23347]: 68: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 69: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 70: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 51: 333333333333333333333333333333333333333333333333333333333
Dec 18 16:44:18 mach99 syslog-test[23347]: 49: 111111111111111111111111111111111111111111111111111111111
Dec 18 16:44:18 mach99 syslog-test[23347]: 71: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 52: 333333333333333333333333333333333333333333333333333333333
Dec 18 16:44:18 mach99 syslog-test[23347]: 53: 333333333333333333333333333333333333333333333333333333333
Dec 18 16:44:18 mach99 syslog-test[23347]: 50: 111111111111111111111111111111111111111111111111111111111
Dec 18 16:44:18 mach99 syslog-test[23347]: 72: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 54: 333333333333333333333333333333333333333333333333333333333
Dec 18 16:44:18 mach99 syslog-test[23347]: 51: 111111111111111111111111111111111111111111111111111111111
Dec 18 16:44:18 mach99 syslog-test[23347]: 73: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 52: 111111111111111111111111111111111111111111111111111111111
Dec 18 16:44:18 mach99 syslog-test[23347]: 53: 111111111111111111111111111111111111111111111111111111111
Dec 18 16:44:18 mach99 syslog-test[23347]: 74: 222222222222222222222222222222222222222222222222222222222
Dec 18 16:44:18 mach99 syslog-test[23347]: 55: 333333333333333333333333333333333333333333333333333333333
Dec 18 16:44:18 mach99 syslog-test[23347]: 54: 111111111111111111111111111111111111111111111111111111111
GNU Libc documentation for syslog
описывает методы, которые в настоящее время «MT-сейф», который является POSIX-говорить «Потокобезопасные».
Методы описаны как «AS-Unsafe» (то есть небезопасный для использования от асинхронного обработчика сигналов).
Документ также отмечает (по состоянию на апрель 2015 года), что эти спецификации являются «предварительными» и не гарантируются во всех будущих версиях. (Я думаю, что это заявление об отказе распространяется на широкую идею категоризации свойств функций безопасности «glibc API», и это все еще немного не работает. Я сомневаюсь, что любой из методов, специфичных для syslog, будет все ослаблен.)
- 1. Являются статическими методами потокобезопасными
- 2. EJB 3.0, являются потокобезопасными?
- 3. Являются ли аккумуляторы потокобезопасными?
- 4. Должен ли openlog() вызывать syslog до или после seteuid/setegid
- 5. Perl Sys :: Syslog on Solaris
- 6. Являются ли addBatch() и executeBatch() потокобезопасными?
- 7. Являются ли однопоточные приложения потокобезопасными
- 8. Что такое объект syslog(), если ни один не является net using openlog()
- 9. Являются ли оранжевые классификаторы потокобезопасными?
- 10. Являются ли локальные переменные потокобезопасными?
- 11. Html Способы помощи являются потокобезопасными?
- 12. Являются ли деревья выражений потокобезопасными?
- 13. Являются ли статические делегаты потокобезопасными?
- 14. Debian: Syslog - Создайте собственный файл журнала
- 15. Где linux хранит мой syslog?
- 16. PHPUnit собирает сообщения syslog?
- 17. Syslog открывается один раз или для каждого журнала
- 18. Являются ли Axis2 сгенерированными заглушками потокобезопасными?
- 19. Являются ли клиентские заглушки .NET WSE потокобезопасными?
- 20. Какие операции в узле являются потокобезопасными?
- 21. Какие члены ConcurrentDictionary .NET являются потокобезопасными?
- 22. Являются ли каналы/заглушки в gRPC потокобезопасными
- 23. Являются ли свойства класса потокобезопасными в delphi?
- 24. Являются ли методы SetValue/GetValue System.Array потокобезопасными?
- 25. Неизменяемые объекты являются потокобезопасными, но почему?
- 26. Являются ли глобальные переменные Python потокобезопасными?
- 27. Какие компоненты VTD xml являются потокобезопасными?
- 28. Являются ли классы Singleton потокобезопасными в IIS?
- 29. Являются ли методы проверки в java.security.cert.Certificate потокобезопасными?
- 30. Являются ли параметры метода потокобезопасными в Java?
на странице, которую вы связали, 'syslog()' и т. д. не находятся в разделе «безопасность потока», но в разделе «Отмена потока». Я не специалист по параллелизму/posix, но это звучит не так. –
@ Александр Малахов В разделе, которое вы смотрите, говорится, что ВСЕ функции posix являются потокобезопасными, за исключением следующих. И syslog/etc. не является частью этого списка не-потоковых функций, поэтому они являются частью потокобезопасных функций. – nos
@nos ах, справа. В момент первого комментария я подумал, что «должно быть» означает «должно быть», но позже я узнал, что это «должно быть». Я должен упомянуть, мои первоначальные сомнения были связаны с конкретной версией Android 4.2, где 'syslog' просочился в дескрипторы файлов при вызове из нескольких потоков. –