当前位置: 首页 > news >正文

制作网站公司哪里好中铁建设集团有限公司总部在哪

制作网站公司哪里好,中铁建设集团有限公司总部在哪,微信小程序开发代码,wordpress多站点模式插件目录 1.进程和线程的概念 2.线程内核三级映射 3.线程优缺点 4.创建线程和获取线程ID的函数 5.创建子线程 6.循环创建N个子线程 7.子线程传参地址错误演示分析 8.主、子线程共享全局变量、堆空间 9.线程退出 10.pthread join回收线程退出值 11.pthread_cancel 12.杀死…

目录

1.进程和线程的概念

2.线程内核三级映射

3.线程优缺点

4.创建线程和获取线程ID的函数

5.创建子线程

6.循环创建N个子线程

7.子线程传参地址错误演示分析

8.主、子线程共享全局变量、堆空间

9.线程退出

10.pthread join回收线程退出值

11.pthread_cancel

12.杀死线程pthread_cancel

13.进程线程对比

14.线程属性简介


1.进程和线程的概念

- Linux 系统中,线程 LWP 称之为:轻量级的进程。
- 进程:有独立的进程地址空间, 有独立的 pcb。 —— 最小资源分配单位。
- 线程:有独立的pcb,没有独立的进程地址空间。(与其他线程共享) —— 最小执行单位。

![1584326812185](课堂笔记10.assets/1584326812185.png)

- 一个创建了线程的进程,本身也沦落 为线程。

![1584327010849](课堂笔记10.assets/1584327010849.png)

- LWP 号: cpu 划分时间片依据。  —— 线程 最小执行单位。
    - 查看LWP号命令: ps -Lf 进程pid 

2.线程内核三级映射

3.线程优缺点

- 优点:
    - 并发性强。  
    - 开销小。
    - 数据通信方便。
- 缺点:
    - 库函数,稳定性差。
    - 调试、编写困难
    - 对信号支持差。
- 结论:既能使用进程开发,也能使用线程开发的程序,首选 线程。

4.创建线程和获取线程ID的函数

```c
#include <pthread.h>
pthread_t pthread_self(void);   // 获取线程id, 在进程内部标识线程身份。

返回线程id。 没有错误!
```

5.创建子线程

```c
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
参1: 传出参数,新子线的 线程id
参2: 线程属性。默认传 NULL, 表使用默认属性。
参3: 子线程回调函数。pthread_create 调用成功,该函数会被自动调用起来。
参4: 参3 的参数。
返回值:
    成功:0
    失败:直接返回错误号!

6.循环创建N个子线程

```c
// 子线程主函数
void *tfn(void *arg)
{
    printf("tfn : pid = %d, pthread_id = %lu\n", getpid(), pthread_self());
    return NULL;
}
int main(int argc, char *argv[])
{
    pthread_t tid;

    // 创建子线程
    int ret = pthread_create(&tid, NULL, tfn, NULL);
    if (ret != 0)
        fprintf(stderr, "pthread_create err:%s\n", strerror(ret));

    printf("main : pid = %d, pthread_id = %lu\n", getpid(), pthread_self());
    sleep(1);        // 给子线程执行时间

    return 0;        // 释放

7.子线程传参地址错误演示分析

8.主、子线程共享全局变量、堆空间

// 阻塞 回收线程。
int pthread_join(pthread_t thread, void **retval);
参1:待回收的线程id
参2:传出参数。回收的那个线程的 退出值。
    进程中:main返回值:return 0、 exit(1)  ---> int。 回收进程退出值 wait(int *)
    线程中:线程返回值:pthread_exit --> void *。 回收线程退出值 pthread_join(void **)
返回值:
    成功:0
    失败:直接返回错误号!
```

9.线程退出

```c
// 子线程主题函数
void *tfn(void *arg)
{
    sleep(5);
    //return (void *)74;
    pthread_exit((void *)"hello");
}

int main(int argc, char *argv[])
{
    pthread_t tid;
    //int *retval;    // 用来存储子进程退出值
    char *retval;    // 用来存储子进程退出值

    // 创建子线程
    int ret = pthread_create(&tid, NULL, tfn, NULL);
    if (ret != 0)
        fprintf(stderr, "pthread_create err:%s\n", strerror(ret));

    printf("----------------1\n");
    // 回收子线程退出值
    ret = pthread_join(tid, (void **)&retval);
    if (ret != 0)
        fprintf(stderr, "pthread_join err:%s\n", strerror(ret));

    printf("child thread exit with %s\n", (char *)retval);

    pthread_exit((void *)0);        // 退出主线程
}

10.pthread join回收线程退出值

```c
struct thrd {
    int var;
    char str[256];
};

// 子线程主题函数
void *tfn(void *arg)
{
    struct thrd *tval = (struct thrd *)arg;            //malloc()
    tval->var = 100;
    strcpy(tval->str, "hello thread");

    pthread_exit((void *)tval);
    // return (void *)tval;                // 也可以
}

int main(int argc, char *argv[])
{
    pthread_t tid;
    struct thrd arg, *retval;

    // 创建子线程
    int ret = pthread_create(&tid, NULL, tfn, (void *)&arg);
    if (ret != 0)
        fprintf(stderr, "pthread_create err:%s\n", strerror(ret));

    // 回收子线程退出值
    ret = pthread_join(tid, (void **)&retval);
    if (ret != 0)
        fprintf(stderr, "pthread_join err:%s\n", strerror(ret));
    
    printf("child exit with: var = %d, str= %s\n", retval->var, retval->str);

    // free();
    
    pthread_exit((void *)0);        // 退出主线程
}

```

11.pthread_cancel

- 与进程类似,线程结束时,也有 “僵尸线程” 产生。消耗系统资源。

```c
int pthread_detach(pthread_t thread);  // 设置线程为分离态。
参:待设置为分离的线程id
```

- 设置为 分离态的 线程,在终止时,会自动清理 pcb 内核残留。
- 对于已经分离的线程,使用 pthread_join() 不能正常回收。不能获取线程退出值。

12.杀死线程pthread_cancel

``c
int pthread_cancel(pthread_t thread);
参:待杀死的线程id
```

1. 被 pthread_cancel() 杀死的线程,在使用 pthread_join() 回收,得到的退出值 -1。 
2. pthread_cancel() 杀死线程必须要到达一个 “取消点” (保存点), 才能生效。否则无法杀死线程。
    - 应该在被cancel的线程中,调用 pthread_testcancel() 函数 来 添加 “取消点” (保存点)。

13.进程线程对比

1. return
2. pthread_exit()
3. pthread_cancel()   需要 “保存点”。 —— 进内核,即可得到。

14.线程属性简介

| 线程控制原语     | 进程控制原语   |
| ---------------- | -------------- |
| pthread_create() | fork()         |
| pthread_self()   | getpid()       |
| pthread_exit()   | exit()         |
| pthread_join()   | wait/waitpid() |
| pthread_cancel() | kill()         |
| pthread_detach() |                |
 

http://www.dtcms.com/a/518098.html

相关文章:

  • 河北网站建设哪里好国内it培训机构排名
  • 专业摄影网站小程序搭建是什么工作
  • 学做网站能赚多少钱wordpress云端采集
  • 网站建设跟加入会员哪个效果好根据网站集约化建设要求
  • 一起装修网官方网站内江做网站哪里便宜
  • 2017网站开发主流工具网站开发报价评估
  • 一、redis安装(单机)和使用
  • 怎样为企业设计网站建筑代理公司是干什么的
  • 做门户网站需要什么网站建设公司汕头的
  • 网站制作方案包含哪些内容网络教学
  • 网站引导页面设计网站怎么申请支付宝
  • C++DirectX9坐标系与基本图元之抗锯齿(AntiAliasing)_0305
  • 怎样看网站有没有做301网站用什么字体做正文
  • 商丘网站建设价格建设网站最强
  • 电子商务网站管理系统完美版上海网站建设天锐科技
  • 域名备案网站漳州做网站建设公司
  • 企业网站建设方案pptwordpress完成静态化
  • 备案ip 查询网站查询系统换公司网站域名要改吗
  • 网站推广优化怎样微信小程序开发实训报告
  • 深圳比较好的建网站公司那种退不掉的网站怎么做的
  • 网站优化方案案例网站自动适应屏幕
  • 网站建设运营公司推荐龙岩天宫山有几个台阶
  • 秦皇岛网络公司 网站托管河南建设安全协会网站
  • apache建设多个网站如何用wordpress挖比特币
  • 怎么查询网站空间商北京住总第一开发建设有限公司网站
  • 椒江住房和城乡建设部网站昆明官渡区网站建设
  • 建设银行怎么加入信用网站网站开发语言哪种简单
  • 建设网站的具体步骤是什么做网站的流程视频教程
  • 宜昌市建设厅官方网站vps开wordpress
  • 网站建设还有需求么抖音网站建设的基本情况