2013-12-18 5 views

ответ

12

Согласно POSIX Specification syslog(), openlog() и closelog() являются потокобезопасными.

Есть еще одна тема, которая также отвечает на этот вопрос и датируется еще в 2009 году. Вот ссылка syslog_r for Linux?.

+0

на странице, которую вы связали, 'syslog()' и т. д. не находятся в разделе «безопасность потока», но в разделе «Отмена потока». Я не специалист по параллелизму/posix, но это звучит не так. –

+0

@ Александр Малахов В разделе, которое вы смотрите, говорится, что ВСЕ функции posix являются потокобезопасными, за исключением следующих. И syslog/etc. не является частью этого списка не-потоковых функций, поэтому они являются частью потокобезопасных функций. – nos

+0

@nos ах, справа. В момент первого комментария я подумал, что «должно быть» означает «должно быть», но позже я узнал, что это «должно быть». Я должен упомянуть, мои первоначальные сомнения были связаны с конкретной версией Android 4.2, где 'syslog' просочился в дескрипторы файлов при вызове из нескольких потоков. –

5

(В то время как я работал на этом опыте, @ 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 
+6

Обратите внимание, что проверка отсутствия ошибок при тестировании довольно сложна и обычно невозможна. – nos

+0

Это был скорее эксперимент, чтобы увидеть, что произойдет, если бы у нас было несколько потоков, которые записывались в syslog одновременно. – rkyser

4

GNU Libc documentation for syslog описывает методы, которые в настоящее время «MT-сейф», который является POSIX-говорить «Потокобезопасные».

Методы описаны как «AS-Unsafe» (то есть небезопасный для использования от асинхронного обработчика сигналов).

Документ также отмечает (по состоянию на апрель 2015 года), что эти спецификации являются «предварительными» и не гарантируются во всех будущих версиях. (Я думаю, что это заявление об отказе распространяется на широкую идею категоризации свойств функций безопасности «glibc API», и это все еще немного не работает. Я сомневаюсь, что любой из методов, специфичных для syslog, будет все ослаблен.)

Смежные вопросы