Chinaunix首页 | 论坛 | 博客
  • 博客访问: 415580
  • 博文数量: 54
  • 博客积分: 1186
  • 博客等级: 少尉
  • 技术积分: 668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-11 04:57
文章分类

全部博文(54)

文章存档

2013年(1)

2012年(6)

2011年(47)

我的朋友

分类: C/C++

2011-05-16 21:37:58

曾经使用过一个用pthread实现的线程池代码,其实原理就是有一个请求就创建一个线程,这样每新建一个线程就分别多一次线程创建和线程销毁的开销,而据说glib中的线程池可以重用线程,比如我要创建100个线程的线程池,线程池最大工作线程为10,那在glib中就只需要创建和销毁10个线程,当其中的一个线程工作完成后,会继续等待新的线程加入。如此一来,100个线程的线程池其实只需要创建和销毁10个线程就行了,效率会高许多。

以上是我对glib线程池的理解,以下代码从网络摘录,并作了简单修改,在FreeBSD下测试通过。

#include
static void test_function(gpointer data, gpointer user_data)
{
        int i;
        i = GPOINTER_TO_INT(data);
        g_print("test %d\n",i);
}

int main()
{
        GThreadPool *pool = NULL;
        GError *error = NULL;
        int i,gthreadcount;
        GMutex *mutex;
        if ( g_thread_supported () )
                printf("support g_thread\n");
        g_thread_init (NULL);
        mutex = g_mutex_new();
        pool = g_thread_pool_new(test_function,NULL,-1,FALSE,&error);
        if(pool == NULL) {
                g_print("can not create thread");
        }
        gthreadcount = g_thread_pool_get_num_threads(pool);
        g_print("%d\n",gthreadcount);

        g_mutex_lock(mutex);
        for(i = 1; i < 10 ; i++)
        {
                g_thread_pool_push(pool, GINT_TO_POINTER( i ) , NULL);
        }
        g_mutex_unlock(mutex);

         /*第二个参数表示是否立即销毁线程池*/

         /*第三个参数表示是否立即返回或等待所有线程完成后再返回*/

         g_thread_pool_free( pool, FALSE, TRUE );

}

执行结果:

0
test 1
test 2
test 3
test 4
test 5
test 6
test 7
test 8
test 9


下面还有一个示例,向线程池中的线程传递一个结构体参数:


  1 #include
  2 #include
    #include
  3 #include
  4
  5 struct TEST {
  6     int x;
  7     int y;
  8 };
  9 static void test_function(gpointer data, gpointer user_data)
 10 {
        struct TEST test;
11     memcpy( &test, ( struct TEST * ) data, sizeof( struct TEST ) );
 12     g_print("x:%d, y:%d\n", test.x, test.y );
 13 }
 14
 15 int main()
 16 {
 17     GThreadPool *pool = NULL;
 18     GError *error = NULL;
 19
 20     int i,gthreadcount;
 21     GMutex *mutex;
 22     if ( g_thread_supported () )
 23         printf("support g_thread\n");
 24     g_thread_init (NULL);
 25     mutex = g_mutex_new();
 26     pool = g_thread_pool_new(test_function,NULL,-1,FALSE,&error);
 27     if(pool == NULL) {
 28         g_print("can not create thread");
 29     }
 30
 31     gthreadcount = g_thread_pool_get_num_threads(pool);
 32     g_print("gthread count is %d\n",gthreadcount);
 33
 34     g_mutex_lock(mutex);
 35     for(i = 1; i < 10 ; i++)
 36     {
 37         struct TEST test;
 38         test.x = 0;
 39         test.y = i;
 40         g_thread_pool_push(pool, ( gpointer ) &test , &error);
 41         usleep( 50000 );
 42         if ( error != NULL )
 43         {
 44             g_print( "error:%s\n", error->message );
 45         }
 46     }
 47     g_mutex_unlock(mutex);
 48     g_thread_pool_free( pool, FALSE, TRUE );
 49     return 0;
 50 }
~
~
:sh
$ gcc -lglib-2.0 -lgthread-2.0 test.c
$ ./a.out
gthread count is 0
x:0, y:1
x:0, y:2
x:0, y:3
x:0, y:4
x:0, y:5
x:0, y:6
x:0, y:7
x:0, y:8
x:0, y:9

参考资料:http://blog.163.com/jiangbowen1_qd/blog/static/61395762201061483929145/
中文帮助手册:

阅读(5576) | 评论(0) | 转发(0) |
1

上一篇:C中调用pcre正则库

下一篇:FreeBSD下安装GLib

给主人留下些什么吧!~~