一个简单的C语言实现的线程示例

在看《Beginning Linux Programming》时,为了更好的理解线程的概念,书中列举了这样一个小例子:

#include

#include

#include

#include

#include

void *thread_function(void *arg);

char message[] = "Hello World";

int main() {

int res;

pthread_t a_thread;

void *thread_result;

res = pthread_create(&a_thread, NULL, thread_function, (void *)message);

if (res != 0) {

perror("Thread creation failed");

exit(EXIT_FAILURE);

}

printf("Waiting for thread to finish...\n");

res = pthread_join(a_thread, &thread_result);

if (res != 0) {

perror("thread join failed");

exit(EXIT_FAILURE);

}

printf("Thread joined, it returned %s\n", (char *)thread_result);

printf("Message is now %s\n", message);

exit(EXIT_SUCCESS);

}

void *thread_function(void *arg) {

printf("thread_function is running, Argument was %s\n", (char *)arg);

sleep(3);

strcpy(message, "Bye!");

pthread_exit("Thank you for the CPU time");

}

将程序编译链接后运行,可以看到下面这样的结果

➜ chapter12 ./thread

Waiting for thread to finish...

thread_function is running, Argument was Hello World

Thread joined, it returned Thank you for the CPU time

Message is now Bye!

这里使用 pthread_create 创建新线程, pthread_create 的定义如下:

#include

int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

根据 pthread_create 要求, thread_function 只有一个指向void的指针作为参数,返回的也是指向void的指针。

当创建新的线程后,新线程在 thread_function 中开始执行,打印自己的参数。

原有线程在确保新线程启动后调用 pthread_join 函数等到线程结束,并且将新线程的返回值存在 thread_result 指针里。

新线程可以直接访问 message 数组变量,如果是调用 fork() 的话就没有这种效果。

python也提供了处理线程相关的 thread 和 基于它上面抽象的 threading 等模块,将在以后的文章中探究。

不由感慨,如果不多懂一些C语言,那么很难提高自己Python水平啊。

线程运行程序c语言,理解线程1 C语言示例的程序相关推荐

  1. 查看java项目线程运行情况,以及总线程数

    查看java项目线程运行情况,以及总线程数 观看tomcat线程或者其他java程序线程数量以及运行情况,可以查看 jdk/bin/jvisualvm.exe当前文件是用来监控线程运行信息 有时候系统 ...

  2. linux子线程运行的函数_Linux中线程使用详解

    4. 线程的属性 前面还说到过线程创建的时候是有属性的,这个属性由一个线程属性对象来描述.线程属性对象由pthread_attr_init()接口初始化,并由pthread_attr_destory( ...

  3. 线程池如何保证所有子线程运行完再执行主线程

    Java主线程等待所有子线程执行完毕在执行,其实在我们的工作中经常的用到,比如说主线程要返回一个响应用户的值,但这个值得赋值过程是由过个子线程来完成的(模拟一个实际开发的情景),所以主线程必须等待子线 ...

  4. [转]从根上理解高性能、高并发:深入计算机底层,理解线程与线程池

    系列 <从根上理解高性能.高并发(一):深入计算机底层,理解线程与线程池> <从根上理解高性能.高并发(二):深入操作系统,理解I/O与零拷贝技术> <从根上理解高性能. ...

  5. 从根上理解高性能、高并发(一):深入计算机底层,理解线程与线程池

    本文原题"聊聊TCP连接耗时的那些事儿",本次收录已征得作者同意,转载请联系作者.有少许改动. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关 ...

  6. 【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 )

    文章目录 I . 线程简单使用 II . 互斥锁 III . 条件变量 线程同步 IV . 完整代码示例 006_ThreadSafeQueue.h 006_ThreadSafeQueue.cpp S ...

  7. 程序,进程,线程的区别和联系

    进程和程序区别和联系表现在以下方面: 1)程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体.而进程则不同,它是程序在某个数据集上的执行.进程是一个动态的实体,它有自己的生命周 ...

  8. 高并发编程-捕获线程运行时的异常 + 获取调用链

    文章目录 概述 捕获线程运行时的异常 使用场景 UncaughtExceptionHandler 接口 示例 获取调用链 使用线程池的场景: 获取线程运行时异常 概述 捕获线程运行时的异常 我们看下T ...

  9. 彻底理解操作系统:1,什么是程序?

    文章目录 那究竟是什么是程序呢? 程序是怎么来的呢? 天才的榆木疙瘩 从文本字符串到机器指令 翻译官编译器和解释器 伟大的C语言 回到操作系统 操作系统也是程序 总结 虽然在这里我们主要关注的是操作系 ...

最新文章

  1. 设计-直接不等于简单
  2. 反弹c语言作业,C语言实现反弹球小游戏
  3. 顺序表应用7:最大子段和之分治递归法
  4. svm 交叉验证 python_【python机器学习笔记】SVM实例:有毒蘑菇预测
  5. linux vim卸载安装包_Linux下卸载安装mysql
  6. ibatise 没有大于等于吗_农村房屋没有证等于违法建筑吗?下面三个时间点记住,小心被忽悠...
  7. JAVA内存存储数据的位置
  8. 使用计算机的女士,3款女性专用PC 将美丽进行到底
  9. [C#反编译教程]001.Reflector.NET反编译工具 v8.5绿色版+注册机+注册教程
  10. koajs 项目实战(二)
  11. JAVAEWEB实现文件的上传案例
  12. 【Machine Learning 四】设置机器学习可用的Matlab编程分配环境
  13. PML调用PDMS内核命令研究
  14. 用python绘制彩色_使用Python/Matplotlib基于彩色地图绘制(极轴)色轮
  15. Julia : 如何生成一个水仙花数?
  16. OWC资料收集-绑定到数据源 Office XP 图表组件
  17. win10如何让外接显示器成为主显示器,笔记本屏幕成为拓展屏幕
  18. 《University Calculus》-chape8-无穷序列和无穷级数-欧拉恒等式
  19. 阿里云服务器不能发送smtp协议邮件问题
  20. 弘辽科技:百分之99卖家不知道的秘密

热门文章

  1. 转一篇关于滑动窗口的讲解,挺详细的
  2. 甲骨文全球大会——看SOA
  3. 备忘之--apache下为站点添加错误页面
  4. fastai 核心部件
  5. mysqldumpslow基本使用
  6. 116-数学运算符更多的使用
  7. selenium自动化测试浏览器驱动安装(属于转载文章)
  8. HihoCoder 1671 DFS
  9. Redux你的Angular 2应用--ngRx使用体验
  10. nodejs实现的简单接口