在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;
}
参考资料:
阅读(2936) | 评论(0) | 转发(0) |