Я хотел бы преобразовать все свои сообщения журнала в моем многопоточном проекте, чтобы использовать средство Apple System Log (или asl).
в соответствии со следующим руководством — https://developer.apple.com/library/ios/documentation/System/Conceptual/ManPages_iPhoneOS/man3/asl_get.3.html
При ведении журнала из нескольких потоков каждый поток должен открывать отдельный дескриптор клиента, используя asl_open.
По этой причине я определил asl-клиент для каждого потока, который будет использоваться во всех моих командах журнала. Однако, сталкиваясь с некоторыми серьезными трудностями в привязке клиента asl к каждой команде asl_log.
1. what if some of my asl log commands reside in a code that is common for
more than one thread - which asl client should i decide use on such message.
2. Even on thread unique code, one should be consistent in choosing the same
asl_client on all log functions on a single thread code scope (this is
not always easy to find in complex projects.).
Есть ли какой-нибудь более простой способ принять мои сообщения журнала проекта для использования asl?
Я думаю о чем-то вроде привязки клиента asl к потоку,
Спасибо
Итак, лучшее решение, которое я нашел на данный момент, — это создание глобальной переменной asl client, которая ориентирована на поток.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <asl.h>
#define NUMTHREADS 4
pthread_key_t glob_var_key;
void print_func() //take global var and use it as the aslclient per thread
{
asl_log(*((aslclient*) pthread_getspecific(glob_var_key)),NULL,ASL_LEVEL_NOTICE, "blablabla");
}
void* thread_func(void *arg)
{
aslclient *p = malloc(sizeof(aslclient));
// added tid to message format to distinguish between messages
uint64_t tid;
pthread_threadid_np(NULL, &tid);
char tid_str[20];
sprintf(tid_str, "%llu", tid);
*p = asl_open(tid_str,"Facility",ASL_OPT_STDERR);
pthread_setspecific(glob_var_key, p);
print_func();
sleep(1); // enable ctx switch
print_func();
pthread_setspecific(glob_var_key, NULL);
free(p);
pthread_exit(NULL);
}int main(void)
{
pthread_t threads[NUMTHREADS];
int i;
pthread_key_create(&glob_var_key,NULL);
for (i=0; i < NUMTHREADS; i++)
pthread_create(&threads[i],NULL,thread_func,NULL);
for (i=0; i < NUMTHREADS; i++)
pthread_join(threads[i], NULL);
}