文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Linux系统中如何创建线程

2023-06-28 13:54

关注

小编给大家分享一下Linux系统中如何创建线程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

线程创建

在传统Unix进程模型中,每个进程只有一个控制线程。在POSIX线程(pthread)的情况下,程序开始运行时,它也是以单进程中的单个控制线程启动的。在创建多个控制线程以前,程序的行为与传统的进程并没有什么区别。新增的线程可以通过调用pthread_create函数创建。

 #include  int pthread_create(pthread_t *restrict tidp,        const pthread_attr_t *restrict attr,        void *(*start_rtn)(void *), void *restrict arg); 12345

说明:当pthread_create成功返回时,新创建线程的线程ID会被设置成tidp指向的内存单元。attr参数用于定制各种不同的线程属性,目前设置为NULL,创建一个具有默认属性的线程。 新创建的线程从start_rtn函数的地址开始运行,该函数只有一个无类型指针参数arg。如果需要想start_rtn函数传递的参数有一个以上,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg参数传入。

例子

创建一个线程,打印进程ID、新线程的线程ID以及初始线程的ID。

 //gcc threadid.c -o a.out -pthread //pthread是linux下的线程库,用了多线程就要链接这个库,这时候要在编译选项上增加-pthread #include "apue.h" #include #include   pthread_t ntid;  void printids(const char *s) {  //声明进程id  pid_t  pid;  //声明线程id  pthread_t tid;  //获取进程id  pid = getpid();  //用pthread_self()获取自己线程id  tid = pthread_self();  printf("%s pid %lu tid %lu (0x%lx)\n", s, (unsigned long)pid,    (unsigned long)tid, (unsigned long)tid); }  void * thr_fn(void *arg) {  //调用上面的打印id函数  printids("new thread: ");  return((void *)0); }  int main(void) {  int  err;   //创建线程,主线程把新线程ID存放在ntid中,新线程去执行thr_fn函数  err = pthread_create(&ntid, NULL, thr_fn, NULL);  if (err != 0)   err_exit(err, "can't create thread");  printids("main thread:");  sleep(1);  exit(0); } 1234567891011121314151617181920212223242526272829303132333435363738394041424344

编译: gcc threadid.c -o a.out -pthread note:pthread是linux下的线程库,用了多线程就要链接这个库,这时候要在编译选项上增加-pthread

 main thread: pid 1518 tid 140627397551936 (0x7fe65e13a740) new thread:  pid 1518 tid 140627389191936 (0x7fe65d941700) 12

可以见到,两个线程地址是不一样的,但是pid父进程都是一样的。

另一个例子

主线程接受一个输入num,创建一个线程打印2*num。

 #include #include #include #include   // 返回值必须是void *(无类型指针),参数也必须是void * void *tfn(void *arg) {     //传进来的是(void *),强制类型转换     int num = (int)arg;     long d2num = 2*num;     printf("In thread %lu arg: %d.\n", (unsigned long)pthread_self(), num);     sleep(1);     printf("Thread over! arg: %d\n", num);     return  (void*)d2num; }  void main(int argc, char *argv[]) {     pthread_t tid;     long num;     void *tret; //获取线程终止状态     while(scanf("%ld", &num) == 1){         pthread_create(&tid, NULL, tfn, (void *)num);         //线程终止         pthread_join(tid, &tret);         printf("Thread exit code: %ld\n", (long)tret);     }      printf("Main thread %lu is over.\n", (unsigned long)pthread_self()); } 12345678910111213141516171819202122232425262728293031

因为在Unix环境高级编程的源代码里代码都是使用makefile链接的,小弟不懂,所以直接将代码copy到已有的文件名中跑了。 下面是结果: Linux系统中如何创建线程 可以看到结果:创建的线程和主线程id号是不一样的。 另外:我觉的在 pthread_create(&tid, NULL, tfn, (void *)num); 直接将num转为指针有点别扭,于是这样: pthread_create(&tid, NULL, tfn, (void *)&num); 然后在tfn函数中将: int num = (int)arg; 改为: int num = *(int*)arg; 也是可以的。

以上是“Linux系统中如何创建线程”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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