4 线程 [1]

      线程和进程类似,是一种允许一个程序同时做多件事情的机制。Linux内核异步的调度线程,时不时的打断它们来给其它线程执行的机会,

这同进程相比线程好像是同时运行的。

     线程存在于进程中。同进程相比线程是更好的执行单元。当你调用一个程序的时候,Linux会创建一个新的进程,在这个进程中创建一个

线程,它有序的执行程序。那个线程可以创建新的线程。所有这些线程在同一个进程中执行相同的程序,但是每个线程可能在任何时间执行

着这个程序的不同部分。

      我们已经知道了一个程序怎样创建一个子进程。这个子进程初始为执行它的父进程的程序,使用父进程的虚拟内存、文件描述符等等所有

直接从父进程拷贝过来的内容。子进程可以使用自己的内存空间,关闭文件描述符等等而不会影响它的父进程,反之亦然。而当一个程序创建

另外一个线程的时候,什么都没有拷贝。正在创建的和已经创建的线程共享内存,文件描述符,和其他的原来的系统资源。比如说,一个线程修改了一个变量的值,其它将会看到修改后的值。类似,如果一个线程关闭了一个文件描述符,其他的线程或许不能再利用那个文件描述符来读取

或者写入了。因为一个进程和它所有的线程只能同时执行一个程序,所以如果任何进程中的一个线程调用了exec函数族中的函数,那么剩下的

所有线程将会停止(当然,新的程序可以创建很多线程)。

     GNU/Linux 实现了POSIX标准的线程API(所谓的 pthreads) 。所有的线程函数和数据类型都在头文件<pthread.h>中声明。线程函数没有包括在标准的C库中。它们包括在libpthread中,所以你应该在编译链接时增加 -lpthread 选项。

 

4.1  创建线程

      进程中的每个线程都由一个线程ID标识。当在C或者C++中用到线程IDs时使用pthread_t类型。

       依赖与创建,每个线程都执行一个线程函数(thread function)。这仅是一个普通的函数包括了一个线程应当执行的代码。当线程函数返回时,线程结束。在标准GNU/Linux中,线程函数只有一个void*参数和一个void* 的返回类型。GNU/LInux不做检测直接把参数传给线程。你的程序可以使用这个参数向一个线程传递数据。同样,你的程序也可以使用返回值让线程想它的创建者返回数据。

         函数pthread_create 可以创建一个新的线程。你需要为它提供如下参数:

         1. 一个指向 pthread_t类型变量的指针,这个变量用来存放新建的线程的ID

         2.一个指向线程属性(thread attribute)对象的指针。这个对象包括了这个新建的线程怎样和程序中其他线程交互的细节。如果你传递一个NULL作为线程属性,线程将被创建为默认的属性。这将在4.1.5中继续讨论。

         3.一个指向线程函数的指针。这是一个普通的函数指针,如下的类型,

                              void* (*) (void*)

        4.void*类型的线程参数值。你传入参数的将简单的传递给线程函数作为参数。

   对pthread_create的调用将会立即返回,原来的线程在调用pthread_create后继续执行。同时,新线程开始执行线程函数。Linux对这两个

线程异步的执行调度。你的程序不应该依赖于这两个线程中的指令的相关顺序(两个线程执行顺序没有一定)。

 

 

Listing 4.1 (thread-create.c) Create a Thread
#include <pthread.h>
#include <stdio.h>
/* Prints x’s to stderr.      The parameter is unused. Does not return. */
void* print_xs (void* unused)
{
  while (1)
     fputc (‘x’, stderr);
  return NULL;
}
/* The main program.    */
int main ()
{
  pthread_t thread_id;
  /* Create a new thread. The new thread will run the print_xs
      function. */
  pthread_create (&thread_id, NULL, &print_xs, NULL);
  /* Print o’s continuously to stderr. */
  while (1)
     fputc (‘o’, stderr);
  return 0;
}

使用下面的指令编译链接这个程序:

$ cc -o thread -create thread-create.c   -lpthread

试着运行并观察发生了什么。注意 x's 和 o's的交替输出说明了Linux交替的调度了这两个线程。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值