午夜稻草人

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
线程编程
  操作用户空间中的线程
 
创建线程
  •调用该线程函数的入口点
  •使用函数pthread_create(),线程创建后,就开始运行相关的线程函数
#include <stdio.h>
 #include <stdlib.h>
 #include <pthread.h>
 
 void *thrd_func(void *arg);
 pthread_t tid;
 
 int main(){
     // 创建线程tid,且线程函数由thrd_func指向,是thrd_func的入口点,即马上执行此线程函数
     if (pthread_create(&tid,NULL,thrd_func,NULL)!=0) {
         printf("Create thread error!\n");
         exit(1);
     }
 
     printf("TID in pthread_create function: %u.\n",tid);
     printf("Main process: PID: %d,TID: %u.\n",getpid(),pthread_self()); 
     
     sleep(1); //race
 
     return 0;
 }
 
 void *thrd_func(void *arg){
 //    printf("I am new thread!\n");
     printf("New process:  PID: %d,TID: %u.\n",getpid(),pthread_self()); //why pthread_self
     printf("New process:  PID: %d,TID: %u.\n",getpid(),tid); //why pthread_self
 
     pthread_exit(NULL); //退出线程
 //    return ((void *)0);
 }

退出线程
  •在线程函数运行完后,该线程也就退出了
  •或使用函数pthread_exit(),这是线程的主动行为
  •不能使用exit()

使调用进程终止,所有线程都终止了

等待线程

  •由于一个进程中的多个线程是共享数据段的,通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放

  •pthread_join()函数

    类似进程的wait()/waitpid()函数,用于将当前线程挂起来等待线程的结束
    是一个线程阻塞的函数,调用它的线程一直等待到被等待的线程结束为止
    函数返回时,被等待线程的资源就被收回

#include <stdio.h>
 #include <stdlib.h>
 #include <pthread.h>
 
 void *thrd_func1(void *arg);
 void *thrd_func2(void *arg);
 
 int main(){
     pthread_t tid1,tid2;
     void *tret;
     // 创建线程tid1,线程函数thrd_func1
     if (pthread_create(&tid1,NULL,thrd_func1,NULL)!=0) {
         printf("Create thread 1 error!\n");
         exit(1);
     }
     // 创建线程tid2,线程函数thrd_func2
     if (pthread_create(&tid2,NULL,thrd_func2,NULL)!=0) {
         printf("Create thread 2 error!\n");
         exit(1);
     }
     // 等待线程tid1结束,线程函数返回值放在tret中
     if (pthread_join(tid1,&tret)!=0){
         printf("Join thread 1 error!\n");
         exit(1);
     }
 
     printf("Thread 1 exit code: %d.\n",(int *)tret);
     // 等待tid2结束,线程函数返回值放在tret中
     if (pthread_join(tid2,&tret)!=0){
         printf("Join thread 2 error!\n");
         exit(1);
     }
 
     printf("Thread 2 exit code: %d.\n",(int *)tret);
 
     return 0;
 }
 
 void *thrd_func1(void *arg){
     printf("Thread 1 returning!\n");
 //    sleep(3);
     return ((void *)1); // 自动退出线程
 }
 
 void *thrd_func2(void *arg){
     printf("Thread 2 exiting!\n");
     pthread_exit((void *)2);  // 线程主动退出,返回(void *)2
 }

取消线程

  •在别的线程中要终止另一个线程
  •pthread_cancel()函数
  •被取消的线程可以设置自己的取消状态
    –被取消的线程接收到另一个线程的取消请求之后,是接受还是忽略这个请求
    –如果接受,是立刻进行终止操作还是等待某个函数的调用等

#include <stdio.h>
 #include <stdlib.h>
 #include <pthread.h>
 
 void *thrd_func1(void *arg);
 void *thrd_func2(void *arg);
 
 pthread_t tid1,tid2;
 
 int main(){
     // 创建线程tid1,线程函数thrd_func1
     if (pthread_create(&tid1,NULL,thrd_func1,NULL)!=0) {
         printf("Create thread 1 error!\n");
         exit(1);
     }
     // 创建线程tid2,线程函数thrd_func2
     if (pthread_create(&tid2,NULL,thrd_func2,NULL)!=0) {
         printf("Create thread 2 error!\n");
         exit(1);
     }
     // 等待线程tid1退出
     if (pthread_join(tid1,NULL)!=0){
         printf("Join thread 1 error!\n");
         exit(1);
     }else
         printf("Thread 1 Joined!\n");
     // 等待线程tid2退出
     if (pthread_join(tid2,NULL)!=0){
         printf("Join thread 2 error!\n");
         exit(1);
     }else
         printf("Thread 2 Joined!\n");
 
     return 0;
 }
 
 void *thrd_func1(void *arg){
 //    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
     pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); // 设置其他线程可以cancel掉此线程
 
     while(1) {
         printf("Thread 1 is running!\n");
         sleep(1);
     }
     pthread_exit((void *)0);
 }
 
 void *thrd_func2(void *arg){
     printf("Thread 2 is running!\n");
     sleep(5);
     if (pthread_cancel(tid1)==0)  // 线程tid2向线程tid1发送cancel
         printf("Send Cancel cmd to Thread 1.\n");
         
     pthread_exit((void *)0);
 }

posted on 2013-04-30 14:01  午夜稻草人  阅读(262)  评论(0编辑  收藏  举报