线程解析(一)

时间:2009-11-26

  作者:曹忠明,华清远见嵌入式学院讲师。

  在使用线程之前我们要知道线程是个怎样的概念,它的作用是什么?

  在学多进程或多线程编程的时候,有这样一个概念----进程是资源管理的单位,线程是程序执行的单位,相对于进程,线程上下文切换花费的开销更少。因为线程共享了内存空间,不同线程可以访问同一个变量,即多有线程都可以访问已经声明了的全局变量。在多进程中这种情况需要使用IPC(进程间通信)对象实现,这样增加了额外的开销,从而降低了性能,并且增加了代码的复杂度。

  在执行方面线程也有着它的优势,因为在创建线程的过程中系统无需复制内存空间和文件描述符等,这样节省了很多的cpu时间。

  首先我们了解几个相关函数

  pthread_create()创建线程,函数原型为:

  int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr,

  void *(*start_routine)(void*), void *restrict arg);

  thread 返回创建线程的ID,attr是创建线程是设置的线程属性。start_routine是线程执行体函数,arg为传递到线程执行体函数的一个参数。

  下面我们写一个简单的多线程的程序。

  pthread1.c

  #include <stdio.h>

  #include <pthread.h>

  void *thread_a(void *arg)

  {

  printf("thread a enter\n");

  }

  void *thread_b(void *arg)

  {

  printf("thread b enter\n");

  }

  int main(int argc, char **argv)

  {

  pthread_t tid_a,tid_b;

  int err;

  err = pthread_create(&tid_a,NULL,thread_a,NULL);

  if(err < 0)

  {

  perror("pthread_create thread_a");

  }

  err = pthread_create(&tid_b,NULL,thread_b,NULL);

  if(err < 0)

  {

  perror("pthread_create thread_a");

  }

  sleep(5);

  printf("the main close\n");

  return 0;

  }

  在这个程序中我们创建了两个线程分别是tid_a和tid_b,thread_a和thread_b分别是他们的执行体。这个时候我们的程序中有了三个线程。因为除了我们常见的两个线程外,主程序也是一个线程。下面我们尝试一下传递一个参数到线程执行体中。

  pthread2.c

  #include <stdio.h>

  #include <pthread.h>

  void *thread_a(void *arg)

  {

  printf("thread a = %d enter\n",*(int *)arg);

  }

  void *thread_b(void *arg)

  {

  printf("thread b = %d enter\n", *(int *)arg);

  }

  int main(int argc, char **argv)

  {

  pthread_t tid_a,tid_b;

  int err;

  err = pthread_create(&tid_a,NULL,thread_a,(void *)&tid_a);

  if(err < 0)

  {

  perror("pthread_create thread_a");

  }

  printf("create tid_a = %d\n",tid_a);

  err = pthread_create(&tid_b,NULL,thread_b,(void *)&tid_b);

  if(err < 0)

  {

  perror("pthread_create thread_a");

  }

  printf("create tid_b = %d\n",tid_b);

  sleep(5);

  printf("the main close\n");

  return 0;

  }
  “本文由华清远见https://www.embedu.org/index.htm提供”



  
上一篇:Linux设备驱动3快速参考汇总--建立和运行模块
下一篇:进程间通信之共享内存(一)

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料