最近做的一个项目中,有这么个需求,系统中使用多线程技术,每个线程访问redis,希望每个线程来保存对redis的一份长链接,而不是每个请求建立一次链接。如果在线程启动之前建立好链接,然后传到线程的私有数据中,可以实现。可是系统的框架封装的实现,无法传入数据,这时可以采用线程的私有数据技术进行储存和获取。
其中,有三个关键的系统API可供调用,分别是:
1、pthread_key_create ,创建一个key,各个线程可以用这个key去读数据和写数据。
2、存储数据,采用pthread_setspecific
3、获取数据,采用pthread_getspecific
这里转载一个网友给出来的示例:http://blog.youkuaiyun.com/lmh12506/article/details/8452700
-
-
-
-
-
-
-
/* The key used to associate a log file pointer with each thread. */
-
-
static pthread_key_t thread_log_key;
-
-
/* Write MESSAGE to the log file for the current thread. */
-
-
void write_to_thread_log (const char* message)
-
-
{
-
FILE* thread_log = (FILE*) pthread_getspecific (thread_log_key);
-
-
fprintf (thread_log, “%s\n”, message);
-
}
-
-
/* Close the log file pointer THREAD_LOG. */
-
-
void close_thread_log (void* thread_log)
-
-
{
-
fclose ((FILE*) thread_log);
-
}
-
-
void* thread_function (void* args)
-
-
{
-
char thread_log_filename[ 20];
-
-
FILE* thread_log;
-
-
/* Generate the filename for this thread’s log file. */
-
-
sprintf (thread_log_filename, “thread%d. log”, ( int) pthread_self ());
-
-
/* Open the log file. */
-
-
thread_log = fopen (thread_log_filename, “w”);
-
-
/* Store the file pointer in thread-specific data under thread_log_key. */
-
-
pthread_setspecific (thread_log_key, thread_log);
-
-
write_to_thread_log (“Thread starting.”);
-
-
/* Do work here... */
-
-
return NULL;
-
}
-
-
int main ()
-
-
{
-
-
int i;
-
-
pthread_t threads[ 5];
-
-
/* Create a key to associate thread log file pointers in
-
-
thread-specific data. Use close_thread_log to clean up the file
-
-
pointers. */
-
-
pthread_key_create (&thread_log_key, close_thread_log);
-
-
/* Create threads to do the work. */
-
-
for (i = 0; i < 5; ++i)
-
-
pthread_create (&(threads[i]), NULL, thread_function, NULL);
-
-
/* Wait for all threads to finish. */
-
-
for (i = 0; i < 5; ++i)
-
-
pthread_join (threads[i], NULL);
-
-
return 0;
-
-
}