GThread 相关接口

同一进程可以包括多个线程,这些线程共享相同的内存空间,而进程都有各自独立的内存空间,进程之间通信需要专门的机制,这无疑增加了内核的开销,降低了系统性能。线程带来的开销很小,内核无需单独复制进程的内存空间或文件描述符等,这就大量地节省了CPU时间,使得创建线程比进程的速度快数十倍。另外,多线程程序作为一种多任务、并发的工作方式,还有以下的优点:1)提高应用程序响应时间;2)使多CPU系统更加有效;3)改善程序结构。 
首先我们理清一下Pthread和Gthread的区别。Pthread即POSIX thread,Posix线程是一个POSIX标准线程,该标准定义内部API创建和操纵线程。Gthread调用的是Glib库中的线程部分;GLib是GTK+和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库。 本软件是带有界面的,并且是GTK+界面,因此,Gthread是最好的选择。
引入Gthread线程的文件在编译时要加入参数`pkg-config --cflags --libs gthread-2.0`。
(1)gboolean g_thread_supported();/*测试是否支持多线程*/
(2)void g_thread_init (GThreadFunctions *vtable);/*初始化多线程支持*/
(3)void gdk_threads_init (void);/*初始化GDK多线程支持*/
(4)void gdk_threads_enter (void);/*进入多线程互斥区域*/
(5)void gdk_threads_leave (void);/*退出多线程互斥区域*/
(6)GThread * g_thread_create (GThreadFunc func, gpointer data, gboolean joinable, GError **error);
这是创建线程函数,func是线程执行的外部函数,data是传给该外部函数的参数,joinable标志线程是否可分离,error是出错代码返回地址。
(7)void g_thread_exit (gpointer retval);/*线程退出,retval为返回状态值*/
(8)GMutex *g_mutex_new ();/*返回一个新的互斥锁*/
(9) void g_mutex_lock(GMutex *mutex);/*上锁*/
(10)void g_mutex_unlock (GMutex *mutex);/*解锁*/
(11)GCond* g_cond_new ();/*返回一个新的信号量*/
(12)void g_cond_signal (GCond *cond);/*释放信号量cond*/
(13)void g_cond_wait(GCond *cond, GMutex *mutex);/*等待信号量cond*/

g_thread_create_full 是一个函数,用于创建一个新的线程并指定其属性。在GLib库中使用该函数来创建线程。 函数原型如下: GThread *g_thread_create_full(GThreadFunc func, gpointer data, gulong stack_size, gboolean joinable, gboolean bound, GThreadPriority priority, GError **error); 其中,各参数的含义如下: - func:线程执行的函数,是一个指向函数的指针。 - data:传递给线程函数的数据,可以是任意类型的指针。 - stack_size:线程堆栈的大小,以字节为单位。如果为0,则使用默认大小。 - joinable:指定线程是否可被其他线程等待和回收资源。 - bound:指定线程是否绑定到特定的处理器核心。 - priority:指定线程的优先级。 - error:用于返回错误信息的 GError 对象。 该函数返回一个 GThread 对象,表示新创建的线程。如果创建线程失败,则返回 NULL,并通过 error 参数返回错误信息。 需要注意的是,g_thread_create_full 函数是 GLib 提供的线程创建接口,操作系统相关。在使用该函数之前,需要先初始化 GLib 库,调用 g_thread_init 函数。 示例代码如下: ```c #include <glib.h> #include <stdio.h> // 线程执行的函数 gpointer thread_func(gpointer data) { gint *value = (gint *)data; printf("Thread value: %d\n", *value); return NULL; } int main() { gint value = 10; // 初始化 GLib 库 g_thread_init(NULL); // 创建线程 GThread *thread = g_thread_create_full(thread_func, &value, 0, FALSE, FALSE, G_THREAD_PRIORITY_NORMAL, NULL); // 等待线程结束 g_thread_join(thread); return 0; } ``` 以上示例代码创建了一个新的线程,并在线程函数中打印传递的值。主线程等待子线程结束后退出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值