Linux下的线程操作
一、多线程的创建于退出
1. pthread_create(线程的创建)
pthread_create 是 POSIX 线程库中的函数,用于创建一个新的线程。
函数原型如下:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
参数说明:
- thread:指向 pthread_t 类型的指针,用于存储新创建线程的标识符。
- attr:指向 pthread_attr_t 类型的指针,用于指定线程的属性。可以传递 NULL,使用默认属性。
- start_routine:指向线程函数的指针,该函数用于执行线程的主要逻辑。
- arg:传递给线程函数的参数,可以是任意类型的指针。
pthread_create 函数会创建一个新的线程,并在新线程中执行指定的线程函数 start_routine。线程函数的参数可以通过 arg 传递。
2.ptherad_join(等待指定线程的终止)
pthread_join 是 POSIX 线程库中的函数,用于等待指定的线程终止,并获取线程的退出状态。
函数原型如下:
int pthread_join(pthread_t thread, void **retval);
参数说明:
- thread:要等待的线程的标识符。
- retval:指向指针的指针,用于存储线程的退出状态。如果不需要获取退出状态,可以传递 NULL。
pthread_join 函数会阻塞当前线程,直到指定的线程终止。一旦线程终止,pthread_join 函数会返回,并将线程的退出状态存储在 retval 指向的位置。如果不需要获取退出状态,可以将 retval 设置为 NULL。
3.pthread_exit(线程的退出)
pthread_exit 是 POSIX 线程库中的函数,用于终止当前线程并返回一个退出状态。
函数原型如下:
void pthread_exit(void *retval);
参数说明:
- retval:线程的退出状态,可以是任意类型的指针。
pthread_exit 函数会立即终止当前线程,并将 retval 参数作为线程的退出状态。线程的退出状态可以是任意类型的指针,因为 pthread_exit 函数的参数类型是 void*。
4.pthread_cancel(线程的取消)
pthread_cancel 是 POSIX 线程库中的函数,用于取消指定的线程。
函数原型如下:
int pthread_cancel(pthread_t thread);
参数说明:
- thread:要取消的线程的标识符。
5.pthread_setcancelstate(设置线程的取消状态)
pthread_setcancelstate 是 POSIX 线程库中的函数,用于设置线程的取消状态。
函数原型如下:
int pthread_setcancelstate(int state, int *oldstate);
参数说明:
- state:要设置的取消状态,可以是以下两个值之一:
- PTHREAD_CANCEL_ENABLE:启用线程的取消功能。
- PTHREAD_CANCEL_DISABLE:禁用线程的取消功能。
- oldstate:用于存储之前的取消状态的指针
pthread_setcancelstate 函数用于设置线程的取消状态。取消状态决定了线程是否可以被取消。如果取消状态被设置为 PTHREAD_CANCEL_ENABLE,则线程可以被取消;如果取消状态被设置为 PTHREAD_CANCEL_DISABLE,则线程不会被取消。
当线程被取消时,会根据取消类型的设置来决定线程的行为。取消类型可以通过 pthread_setcanceltype 函数设置。
6.例子
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
pthread_t tid[2];
//void *类型的函数可以没有显示的返回值
void *my_thread1(void *arg)
{
for(int i = 0; i < 3; i++)
{
printf("this is my_thread1\n");
sleep(1);
}
//取消线程2
pthread_cancel(tid[1]);
//线程退出
// pthread_exit((void *)100);
return (void *)100;
}
void *my_thread2(void *arg)
{
//修改属性,不能被取消
int old;
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old);
for(int i = 0; i < 5; i++)
{
printf("%s\n", (char *)arg);
sleep(1);
}
}
int main()
{
//1.线程号 2.线程属性 3.线程函数 3.线程函数参数
if(pthread_create(&tid[0], NULL, my_thread1, NULL) != 0)
{
perror("pthread_create");
exit(1);
}
//虽然 "helloworld" 是一个字符串常量,但它在 C 语言中被视为字符数组的首地址,
//因此可以将其传递给 pthread_create 函数作为参数。
if(pthread_create(&tid[1], NULL, my_thread2, "helloworld") != 0)
{
perror("ptherad_create");
exit(2);
}
//主线程一定不能提前结束
//主线程等待,直到两个线程都结束
void *status;
pthread_join(tid[0], &status); //等待子线程结束,回收线程资源
printf("线程1结束: %d\n", (int)status);
pthread_join(tid[1], &status);
printf("线程2结束\n");
return 0;
}