zoukankan      html  css  js  c++  java
  • 11 | 线程:如何让复杂的项目并行执行?

    一、为什么要有线程 和 什么是线程?(why and waht)

    1.概念:进程相当于一个项目,而线程就是为了完成项目需求,而建立的一个个开发任务。
    2.为什么有进程还需线程
     2.1资源问题 通信问题 执行问题
    • 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。

    • 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。

    二、如何创建线程?(how)
    1 #include <pthread.h>
    2 #include <stdio.h>
    3 #include <stdlib.h>
    4
    5 #define NUM_OF_TASKS 5
    6
    7 void *downloadfile(void *filename)
    8 {
    9 printf("I am downloading the file %s! ", (char *)filename);
    10 sleep(10);
    11 long downloadtime = rand()%100;
    12 printf("I finish downloading the file within %d minutes! ", downloadtime);
    13 pthread_exit((void *)downloadtime);
    14 }
    15
    16 int main(int argc, char *argv[])
    17 {
    18 char files[NUM_OF_TASKS][20]={"file1.avi","file2.rmvb","file3.mp4","file4.wmv","file5
    19 pthread_t threads[NUM_OF_TASKS];
    20 int rc;
    21 int t;
    22 int downloadtime;
    23
    24 pthread_attr_t thread_attr;
    25 pthread_attr_init(&thread_attr);
    26 pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_JOINABLE);
    27
    28 for(t=0;t<NUM_OF_TASKS;t++){
    29 printf("creating thread %d, please help me to download %s ", t, files[t]);
    30 rc = pthread_create(&threads[t], &thread_attr, downloadfile, (void *)files[t]);
    31 if (rc){
    32 printf("ERROR; return code from pthread_create() is %d ", rc);
    33 exit(-1);
    34 }
    35 }
    36
    37 pthread_attr_destroy(&thread_attr);
    38
    39 for(t=0;t<NUM_OF_TASKS;t++){
    40 pthread_join(threads[t],(void**)&downloadtime);
    41 printf("Thread %d downloads the file %s in %d minutes. ",t,files[t],downloadtime)
    42 }
    43
    44 pthread_exit(NULL);
     
    三、线程特点(how)
    线程数据
    3.1
    第一类是线程栈上的本地数据,比如函数执行过程中的局部变量。前面我们说过,函数的调
    用会使用栈的模型,这在线程里面是一样的。只不过每个线程都有自己的栈空间。
    3.2
    第二类数据就是在整个进程里共享的全局数据。例如全局变量,虽然在不同进程中是隔离
    的,但是在一个进程中是共享的。如果同一个全局变量,两个线程一起修改,那肯定会有问
    题,有可能把数据改的面目全非。这就需要有一种机制来保护他们,锁机制。
    3.3
    这就是第三类数据,线程私有数据(Thread Specific Data),
    int pthread_setspecific(pthread_key_t key, const void *value) 设置私有数据值
    void *pthread_getspecific(pthread_key_t key) 获取私有数据值
    线程数据的保护
    一种方式,Mutex,全称 Mutual Exclusion互斥锁
    条件变量
     
     
    总结
  • 相关阅读:
    store.js
    ## $.each() 与.each()的区别
    创建新的option
    js 一个程序运行的时间计算
    HTML5之FileReader的使用(转)
    js 队列
    js 栈(进制转换)
    原生js实现二级联动
    原生js实现三级联动
    工具安装-Mac 卸载python3
  • 原文地址:https://www.cnblogs.com/mzyc/p/11923389.html
Copyright © 2011-2022 走看看