pthread_create(pthreadcreate没有新建thread)

2023-05-15T08:55:48

摘要:

pthread_create()是一个C语言函数,用于在Linux系统上创建新的线程。它采用了POSIX线程标准,可以在单个程序中创建多个执行线程。通过创建多个线程,程序可以在多个任务之间共享资源和同时执行多个任务。本文将深入探讨pthread_create()函数及其使用方式。

1.关于pthread_create()

pthread_create(pthreadcreate没有新建thread)

pthread_create()是一个非常重要的函数,它可以在程序执行期间创建一个新的线程。

使用pthread_create()函数,需要向该函数传递一个指向线程标识符的地址、线程属性的指针以及一个函数指针,该指针指向新线程将执行的函数。

基本的pthread_create()使用示例:

#include 
void *myFunction(void *arg);
int main()
{
    pthread_t myThread;
    int status;
    status = pthread_create(&myThread, NULL, myFunction, NULL);
    pthread_join(myThread, NULL);
    return 0;
}
void *myFunction(void *arg)
{
    // do some work
}

上述示例中,pthread_t数据类型定义了本地线程标识符。该函数向myThread指针传递了地址,以便在pthread_create()中填充新线程的标识符。线程的属性参数为NULL,表示使用默认的线程属性。

2. pthread_create()函数的参数

pthread_create(pthreadcreate没有新建thread)

在开始使用pthread_create()函数之前,有必要了解该函数接受的参数。

a. 线程标识符

pthread_t数据类型定义了本地线程标识符。该函数接受一个指向该类型的指针,用于存储新线程的标识符。

b. 线程属性

pthread_create()还接受一个指向线程属性结构体的指针,用于指定创建线程时使用的属性和特征。如果不希望设置这些属性,则可以将该参数设为NULL,使用默认属性。

在需要设置属性时,需要使用pthread_attr_init()和pthread_attr_destroy()函数。

下面是几个常用的线程属性:

  • pthread_attr_setdetachstate() - 设置线程的分离状态
  • pthread_attr_setschedpolicy() - 设置线程调度策略
  • pthread_attr_setschedparam() - 设置线程的调度参数
  • pthread_attr_setstacksize() - 设置线程的堆栈大小

c. 线程函数

pthread_create()还接受一个指向线程函数的指针,用于指定新线程将要执行的函数。

线程函数必须返回void指针,并接受void指针参数。这个void指针参数可以传递任何类型的数据。

3. 创建多个线程

pthread_create(pthreadcreate没有新建thread)

前面的示例只创建了一个线程。实际上,可以在程序中创建若干个线程。为了实现这一目的,需要在应用程序中设置线程池。

a. 创建线程池

要创建线程池,可以使用两种方法:

  • 手动管理线程池 - 手动创建线程并将它们添加到池中
  • 使用线程池库 - 使用可用的线程池库,如libevent,以减轻工作负担

b. 线程池数据结构

下面是一个经典的线程池数据结构:

typedef struct {
    pthread_mutex_t lock;
    pthread_t *threads;
    void *(*function)(void *);
    void *arg;
    int max_threads;
    int running_threads;
} threadpool;

这里有以下几个元素:

  • lock - 用于保护线程池的互斥体
  • threads - 包含为此线程池分配的所有线程的数组
  • function - 指向线程函数的指针
  • arg - 传递给线程函数的参数
  • max_threads - 线程池中最大线程数
  • running_threads - 当前正在运行的线程数

4. 线程池控制

pthread_create(pthreadcreate没有新建thread)

现在已经了解了如何创建并管理线程池,下面是一些针对线程池的控制方法:

a. 向线程池添加新任务

向线程池添加新任务的最佳方案是将其添加到队列中。这样可以确保在执行其他任务时不会立即运行它。

b. 相互通信

线程池可能需要在运行中相互通信。要实现这一目的,可以使用一个全局变量,将数据传递给所有线程,并使线程共享该变量。

另一种方法是使用条件变量,在所有线程之间同步数据。条件变量用于阻止线程,直到满足条件后再恢复线程。条件变量需要与互斥体一起使用,以确保线程安全。

c. 结束线程

如果线程池已经工作一段时间,可能需要关闭线程。实现这一目的的最佳方法是使用pthread_cancel()函数。该函数可以强制停止正在运行的线程。

要停止线程,必须在每个线程中设置取消点,以便在接收到取消消息时自动终止。

本文深入探讨了pthread_create()函数及其使用方式。我们讲解了pthread_create()的参数、如何创建多个线程、线程池的数据结构以及控制线程池的方法。当需要在Linux系统上管理多个线程时,使用pthread_create()函数是非常有用的。