线程的概念
线程是存在于进程空间中的,使用进程的资源。创建和调度时空开销都比进程小。
- 进程是资源分配的基本单位。重量级进程。进程空间独立,不能直接通信。
- 线程是系统调度的最小单位。轻量级进程。一般是一个进程中的多个任务。线程可以共享空间,可以直接通信。
Linux线程
Linux中的线程库包括LinuxThreads和NPTL(Native Posix Thread Library)。NPTL是实现线程操作的库,创建多线程包括线程空间操作和线程资源回收等过程。
线程的创建pthread_create:
int pthread_create( pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
(1)功能:该函数可以创建指定的一个线程。
(2)参数:
a)thread:线程id,需要实现定义并由该函数返回。
b)attr:线程属性(默认(可结合性)和分离属性)。默认属性(NULL)自己手动回收,分离属性系统自动回收。
c)start_routine:线程执行函数(回调函数),指向指针函数的函数指针。
d)arg:回调函数的参数,成功返回0,失败返回错误码。
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
void * do_something(void *arg)
{
//线程的任务函数
printf("------do_something ---- \n");
}
int main(int argc, const char *argv[])
{
pthread_t tid;
int ret = pthread_create(&tid,NULL,do_something,NULL);
if (ret != 0)
{
errno = ret;
perror("pthread_create fail");
return -1;
}
sleep(3);
return 0;
}
线程的执行就体现在线程的执行函数上。
注意:Compile and link with -pthread
线程的退出:
(1)void pthread_exit(void *retval);
结束调用的进程
子线程自行退出,参数为线程退出时候的返回状态。
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
void * do_something(void *arg)
{
static int a = 10;
//线程的任务函数
printf("------do_something ---- \n");
//pthread_exit(NULL);
pthread_exit(&a);
//pthread_exit((void *)a);
}
int main(int argc, const char *argv[])
{
pthread_t tid;
int ret = pthread_create(&tid,NULL,do_something,NULL);
if (ret != 0)
{
errno = ret;
perror("pthread_create fail");
return -1;
}
//sleep(3);
void *retval;
//pthread_join(tid,&retval);
pthread_join(tid,&retval);
printf("---- main----%d\n",*(int *)retval);
// printf("---- main----%d\n",(int)retval);
pthread_exit(NULL);
return 0;
}
若用在main函数中,表示结束主线程,进程不一定结束。主线程执行流结束,进程会在其余线程都结束后结束。
总结
多线程程序设计:可以包括专门的线程进行资源申请和初始化、执行处理程序以及进行资源释放。
线程间通信:由于线程共享进程资源,需要注意线程间的通信和同步,以保证数据的正确性和安全性。通过合理使用线程,可以提高程序的并发性能,但在使用过程中需要注意线程的安全性、稳定性和调试等问题。希望本文对大家理解和使用Linux中的线程有所帮助,如有不足之处,欢迎大家指正。
标签:int,void,线程,pthread,进程,include From: https://blog.csdn.net/qq_69639971/article/details/141198490