文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言由浅入深讲解线程的定义

2024-04-02 19:55

关注

线程的概念

可以简单理解为一个正在独立运行的函数

注:

1.posix线程是一套标准吗,而不是实现

2.线程标识: phread_t,可能是整形也可能是结构体指针等

*简单介绍关于线程标识的函数*
 *pthread_equarl() ;判断两个线程标识是否相等*
*pthread_self();返回自身的线程标识* 

线程的创建

pthread_creat();

int pthread_create(

pthread_t *restrict tidp, //新创建的线程ID指向的内存单元。

const pthread_attr_t *restrict attr, //线程属性,默认为NULL

void *(*start_rtn)(void *), //新创建的线程从start_rtn函数的地址开始运行

void *restrict arg //默认为NULL。若上述函数需要参数,将参数放入结构中并将地址作为arg传入。);

线程的调度取决于调度器策略

# include<stdlib.h>
# include<pthread.h>
static void* func(void* p)
{
 puts("thread is working");
 return NULL;
}
int main()
{
  pthread_t tid;
  int err;
  puts("begin!");
  err = pthread_create(&tid,NULL,func,NULL);
  if(err)
  {
   exit(-1);
  }
  puts("end!");
  exit(0);
}

线程的终止

3种方式 :

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);

取消有两种状态 : 允许和不允许

允许取消又分为: 异步cancel , 推迟 cancel(默认) -> 推迟到cancel点

cancel点: posix定义的canceldian 都是可能引发阻塞的系统调用

pthread_setcancelstate(int );//设置是否允许取消

pthread_setcanceltype(); //设置取消方式 异步还是推迟

注:pthread_cancel 调用具有具有一定的延时性,因为cancel点: posix定义的canceldian 都是可能引发阻塞的系统调用,并不会立即被处理,不建议当线程立即被创建后立即进行cancel取消(线程创建,并不会立即被调度);也不建议在线程退出前执行线程cancel取消(线程可能在取消之前就已经退出了);建议在线程执行中进行cancel取消线程

void pthread_testcancel(void); //本函数为设置取消点

当不关心线程的返回信息时可以直接使用线程分离函数进行回收

反之,需要获取线程的返回值时,可以使用线程等待

线程等待

int pthread_join(pthread_t thread, void **value_ptr);

第一个参数是线程标识,第二是传出型参数用来获取线程的返回值

注意:

终止获取的状态情况:

线程分离

int pthread_detach(pthread_t thread);

默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统泄漏

如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源

注:

可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离:

pthread_detach(pthread_self());

joinable和分离是冲突的,一个线程不能既是joinable又是分离的

线程的分离也是具有一定延时性,分离之后如果再进行等待那么得到返回的结果是未定义的

线程分离后只是回收的时候自动进行回收,如果主线程先退出,那么整个进程也会退出;如果分离的线程执行崩溃,同样的整个进行也会崩溃

到此这篇关于C语言由浅入深讲解线程的定义的文章就介绍到这了,更多相关C语言线程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯