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

全部博文(54)

文章存档

2013年(1)

2012年(6)

2011年(47)

我的朋友

分类: C/C++

2011-05-21 10:50:28

在Glib线程池之前,写了两个简单的测试代码:

1. 向线程池中的线程传递一个int参数
2. 向线程池中的线程传递一个结构体

在测试时,两个例子都没出现问题,但当把Glib线程池应用到项目中时,却老提示Segmentation faults(段错误),线程池的线程函数如下:

GMutex *mutex;

static void pool_thread( gpointer data, gpointer user_data )
{
    struct TEST test;
    memcpy( &test, ( TEST* ) data, sizeof( TEST ) );
    g_mutex_unlock( mutex );
}

线程池创建函数如下:

struct TEST test;
pool = g_thread_pool_new( PoolThread, NULL, 100, FALSE, NULL );
for(;;;)
{
    g_mutex_lock( mutex );
   
    /*向TEST结构体写入数据*/

   /*向线程池投入线程*/
   GError *error;
   g_thread_pool_push(pool, ( gpointer ) &test , &error);
   //usleep( 50000 );
}

其实在没有使用互斥量之前,我是使用usleep来保存线程函数中的memcpy有时间执行。程序出现段错误后,使用了互斥量,但问题仍然不能解决。最后发现原来向线程函数传入的结构体参数都是同一个指针地址,但很奇怪为什么互斥量没起作用,或许可以试试临界区。最后的解决办法如下:


pool = g_thread_pool_new( PoolThread, NULL, 100, FALSE, NULL );
for(;;;)
{
    TEST *test = new TEST();
   
    /*向TEST结构体写入数据*/

   /*向线程池投入线程*/
   GError *error;
   g_thread_pool_push(pool, ( gpointer ) test , &error);
   //usleep( 50000 );
}

static void pool_thread( gpointer data, gpointer user_data )
{
    struct TEST *test = (TEST*)data;
    test->str = str;
    test->num = num;
    delete test;
}

参考资料:

阅读(2925) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~