请写一个使用GThreadPool 的例子
时间: 2024-03-22 18:41:49 浏览: 139
好的,以下是一个使用 GThreadPool 的例子:
```c
#include <stdio.h>
#include <glib.h>
// 线程执行函数
void task_func(gpointer data, gpointer user_data) {
gint task_id = GPOINTER_TO_INT(data);
printf("Task %d is running in thread %lu\n", task_id, pthread_self());
}
int main() {
GThreadPool *pool;
// 创建一个线程池,最多同时运行 4 个线程
pool = g_thread_pool_new(task_func, NULL, 4, FALSE, NULL);
// 添加任务到线程池中
gint i;
for (i = 0; i < 10; i++) {
g_thread_pool_push(pool, GINT_TO_POINTER(i), NULL);
}
// 等待所有任务完成
g_thread_pool_free(pool, FALSE, TRUE);
return 0;
}
```
该例子创建了一个使用 GThreadPool 的线程池,并向其中添加了 10 个任务,每个任务的执行函数为 `task_func`。线程池最多同时运行 4 个线程。最后等待所有任务完成后释放线程池。
相关问题
写一个GThread的例子
好的,以下是一个简单的 GThread 例子:
```c
#include <glib.h>
void* thread_func(void* data) {
int i;
for (i = 0; i < 10; i++) {
g_print("Thread: %d\n", i);
g_usleep(500000); // sleep for 500ms
}
return NULL;
}
int main() {
GThread* thread;
GError* error = NULL;
// create a new thread
thread = g_thread_try_new("my-thread", thread_func, NULL, &error);
if (thread == NULL) {
g_print("Error creating thread: %s\n", error->message);
g_error_free(error);
return 1;
}
// wait for the thread to finish
g_thread_join(thread);
return 0;
}
```
在这个例子中,我们首先定义了一个函数 `thread_func`,它会在新的线程中运行。该函数会打印出一些信息,并休眠 500 毫秒,然后重复执行 10 次。
接下来,我们在 `main` 函数中创建了一个新的 GThread 对象,使用了 `g_thread_try_new` 函数。这个函数的第一个参数是线程的名称,第二个参数是要运行的函数,第三个参数是函数的参数,最后一个参数是一个指向 GError 的指针,用于返回任何错误信息。
如果线程创建成功,我们就使用 `g_thread_join` 函数等待线程结束。最后,我们返回 0 表示程序正常结束。
注意,在使用 GThread 时,需要在编译时链接 Glib 库。例如,使用以下命令进行编译:
```
gcc -o my-program my-program.c `pkg-config --cflags --libs glib-2.0`
```
gthread使用注意
在使用 gthread(GNU C Library中的一个库)时,有几个注意事项:
1. 初始化和销毁:在使用 gthread 之前,需要调用 `gthread_init()` 函数进行初始化。在程序结束时,可以调用 `gthread_deinit()` 函数进行清理和销毁。
2. 线程创建和销毁:使用 `gthread_create()` 函数创建线程,并通过传递函数指针作为参数来执行特定的任务。通过调用 `gthread_join()` 函数等待线程完成并回收资源。
3. 互斥量:gthread 提供了互斥量(mutex)来保护共享资源的访问。使用 `gthread_mutex_lock()` 和 `gthread_mutex_unlock()` 函数来保证在访问共享资源时的互斥性。
4. 条件变量:使用条件变量(condition variable)可以实现线程之间的同步。通过 `gthread_cond_wait()` 和 `gthread_cond_signal()` 函数来等待和唤醒特定条件的线程。
5. 取消线程:可以使用 `gthread_cancel()` 函数来取消一个正在运行的线程。
6. 线程局部存储:gthread 提供了线程局部存储(thread-local storage)的支持,可以使用 `gthread_key_create()` 和 `gthread_setspecific()` 函数来创建和设置线程局部变量。
7. 错误处理:在使用 gthread 函数时,需要注意错误处理。可以通过检查函数的返回值或者使用 `gthread_get_errno()` 函数来获取错误码。
请注意,gthread 是 GNU C Library 中的一部分,不是标准的 C 语言库。在使用 gthread 之前,确保你的编译环境中已经安装了 GNU C Library。另外,根据具体的操作系统和编译器,使用 gthread 可能需要额外的配置和设置。