资讯专栏INFORMATION COLUMN

理解线程1 C语言示例的程序

lncwwn / 1906人阅读

摘要:一个简单的语言实现的线程示例在看时,为了更好的理解线程的概念,书中列举了这样一个小例子将程序编译链接后运行,可以看到下面这样的结果这里使用创建新线程,的定义如下根据要求,只有一个指向的指针作为参数,返回的也是指向的指针。

一个简单的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...
");
  res = pthread_join(a_thread, &thread_result);
  if (res != 0) {
    perror("thread join failed");
    exit(EXIT_FAILURE);
  }
  printf("Thread joined, it returned %s
", (char *)thread_result);
  printf("Message is now %s
", message);
  exit(EXIT_SUCCESS);
}

void *thread_function(void *arg) {
  printf("thread_function is running, Argument was %s
", (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水平啊。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44263.html

相关文章

  • [Java并发-2]Java如何解决可见性问题

    摘要:诞生之处就支持多线程,所以自然有解决这些问题的办法,而且在编程语言领域处于领先地位。,线程规则这条是关于线程启动的。在语言里面,的语义本质上是一种可见性,意味着事件对事件来说是可见的,无论事件和事件是否发生在同一个线程里。 之前我们说了:1,可见性2,原子性3,有序性3个并发BUG的之源,这三个也是编程领域的共性问题。Java诞生之处就支持多线程,所以自然有解决这些问题的办法,而且在编...

    lk20150415 评论0 收藏0
  • 理解线程3 c语言示例线程基本操作

    摘要:基本线程的动作继续之前语言线程的文章文章文章来了解基本的线程操作。属性用完后对其进行清理回收通过共享的变量来检测子线程是否已经结束代码如下设置调度属性线程库提供以下调度策略先进先出调度。 基本线程的动作 继续之前C语言线程的文章:文章1 文章2 来了解基本的线程操作。 设置线程属性 设置脱离状态 下面代码中关键的地方在于: 通过 res = pthread_attr_init(...

    A Loity 评论0 收藏0
  • 双重检查锁定与延迟初始化

    摘要:基于的双重检查锁定的解决方案对于前面的基于双重检查锁定来实现延迟初始化的方案指示例代码,我们只需要做一点小的修改把声明为型,就可以实现线程安全的延迟初始化。 双重检查锁定的由来 在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下...

    yvonne 评论0 收藏0
  • JS高级入门教程

    摘要:解析首先简称是由欧洲计算机制造商协会制定的标准化脚本程序设计语言。级在年月份成为的提议,由核心与两个模块组成。通过引入统一方式载入和保存文档和文档验证方法对进行进一步扩展。其中表示的标记位正好是低三位都是。但提案被拒绝了。 JS高级入门教程 目录 本文章定位及介绍 JavaScript与ECMAScript的关系 DOM的本质及DOM级介绍 JS代码特性 基本类型与引用类型 JS的垃...

    zsy888 评论0 收藏0

发表评论

0条评论

lncwwn

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<