本文主要介绍C语言中线程的基础知识,通过实例代码非常详细的介绍,对大家的学习或工作有一定的参考价值。有需要的朋友下面和边肖一起学习。
目录
线程的概念线程的创建线程的终止线程的比较线程的识别线程的取消等待线程的分离
线程的概念
可以简单理解为独立运行的功能。
注意:
1.1.posix线程是一组标准,而不是一个实现吗?
2.线程ID: phread_t,可能是造型或者结构指针等。
*简要介绍螺纹识别的功能*
* pthread _ equarl();判断两个线程标识是否相等*
* pthread _ self();返回它自己的线程ID *
线程的创建
pthread _ creat();
int pthread_create(
Pthread_t *restrict tidp,//新创建的线程ID指向的内存单元。
constpthread _ attr _ t * restrict attr,//thread属性,默认值为NULL
Void *(*start_rtn)(void *),//新创建的线程从start_rtn函数的地址开始运行。
默认情况下,Void *restrict arg //为NULL。如果上述函数需要参数,则将参数放入结构中,并将地址作为arg传入。);
线程的调度取决于调度器策略。
# includestdlib.h
# includepthread.h
静态空*函数(空* p)
{
puts(“线程正在工作”);
返回NULL
}
int main()
{
pthread _ t tid
int err
puts('begin!');
err=pthread_create(tid,NULL,func,NULL);
如果(错误)
{
退出(-1);
}
puts('end!');
退出(0);
}
线程的终止
三种方式:
1)线程从启动进程返回,返回值是线程的退出代码。
2)一个线程可以被同一进程中的其他线程取消
3)线程可以调用pthread)exit()函数
线程出口函数
void pthread _ exit(void * value _ ptr);
线程标识的比较
获取线程号
pthread _ t pthread _ self(void);
比较
int pthread_equal(pthread_t t1,pthread _ t T2);
线程的取消
int pthread _ cancel(pthread _ t thread);
取消有两种状态:允许和不允许。
允许取消可分为:异步取消、延迟取消(默认)-延迟到取消点。
取消点:posix定义的所有canceldian都是可能导致阻塞的系统调用。
pthread _ setcancelstate(int);//设置是否允许取消。
pthread _ setcanceltype();//设置取消方式是异步还是延迟。
注意:pthread_cancel调用有一定的延迟,因为posix定义的cancel point: canceldian都是可能造成拥塞的系统调用,不会立即处理。不建议线程创建后立即取消(线程已创建,不会立即调度);也不建议在线程退出前取消它(线程在取消前可能已经退出);建议在线程执行过程中取消线程。
void pthread _ test cancel(void);//这个函数设置取消点。
当你不关心线程的返回信息时,可以直接使用线程分离功能进行回收。
相反,当需要获取线程的返回值时,可以使用线程等待。
线程等待
int pthread _ join(pthread _ t thread,void * * value _ ptr);
第一个参数是线程ID,第二个参数是用来获取线程返回值的传出参数。
注意:
调用此函数的线程将挂起并等待,直到id为thread的线程终止。这里得到的线程退出信息没有终止信号信息,但是终止信号信息是针对整个进程的。如果线程收到信号,也会导致整个进程崩溃。线程终止方式不同,pthread_join得到的终止状态也不同。
终止状态:
如果线程通过return返回,value_ ptr指向的单元格存储线程函数的返回值。如果线程被另一个调用pthread_ cancel的线程异常终止,则常量PTHREAD_ CANCELED存储在value_ ptr指向的单元格中。如果线程是通过自己调用pthread_exit来终止的,那么value_ptr指向的单元格就存储传递给pthread_exit的参数。如果对线程的终止状态不感兴趣,可以将NULL传递给value_ ptr参数。
线程分离
int pthread _ detach(pthread _ t thread);
默认情况下,新创建的线程是可连接的。线程退出后,需要pthread_join操作,否则无法释放资源,导致系统泄漏。
如果你不关心线程的返回值,那么Join就是一个负担。这时候我们可以告诉系统在线程退出的时候自动释放线程资源。
注意:
线程组中的其他线程可以分离目标线程,或者线程本身可以分离:
pthread _ detach(pthread _ self());
可连接和分离冲突,线程不能既可连接又可分离。
线程的分离也有一定的延迟。如果在分离后等待,返回的结果是未定义的。
线程分离后,只自动回收。如果主线程先退出,整个进程也会退出。如果分离的线程执行崩溃,相同的整个进程也将崩溃。
关于C语言的这篇文章到此为止,由浅入深地解释线程的定义。更多相关C语言线程内容,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。