zoukankan      html  css  js  c++  java
  • 理解线程的小程序

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

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

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
    
    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 <pthread.h>
    
    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水平啊。

  • 相关阅读:
    codeforces 501 C,D,E
    bzoj 3172 单词 ac自动机|后缀数组
    HDU2459 后缀数组+RMQ
    POJ 3294 二分找超过一半字符串中存在的子串
    头文件
    python爬取文本
    python爬取图片
    NEW
    dsu on tree 练习题
    lzz分块+莫队
  • 原文地址:https://www.cnblogs.com/nisen/p/6071739.html
Copyright © 2011-2022 走看看