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

Linux 进程与线程六

//线程间的通信
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>

/*线程1与控制线程通信方法1--全局变量*/
int g_num=10;

void *thread_run(void *arg)
{
    //线程1被分离了,但最好不要使用pthread_join()函数接受,多线程下报错内存溢出
    pthread_detach(pthread_self());
    int *p=(int *)arg;
    (*p)++;
    g_num=12;
    /*线程1与控制线程通信方法2--pthread_exit()函数的参数*/
    //pthread_exit(p);
    //执行pthread_exit()函数后,线程会直接退出
    printf("线程1退出了!\n");\
    /*线程1与控制线程通信方法3--线程中return*/
    return p;
}

int main(int arg,char *args[])
{
    /*
     * 每个线程都拥有各自的栈内存,但是彼此之间的栈内存是可以互相访问,
     * 比如在控制线程定义的变量,可以在线程1中访问
     * 线程1中定义变量可能无法在控制线程访问,因为无法确定变量是否因为线程执行完毕被释放了
     * */
    int index=0;
    pthread_t thr1;
    if(pthread_create(&thr1,NULL,thread_run,&index)!=0)
    {
        printf("pthread_create() failed !\n");
        return -1;
    }
    //等待线程1
    int *p=NULL;
    pthread_join(thr1,(void **)&p);
    printf("线程1的返回值%d\n",*p);
    printf("控制线程的index=%d\n",index);
    printf("g_num=%d\n",g_num);
    return 0;
}

 

//线程的并行执行
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>

void *thread_run(void *arg)
{
    //pthread_detach(pthread_self());
    if (arg != NULL)
    {
        int *p = (int *) arg;
        int i = 0;
        for (i = 0; i < *p; i++)
        {
            printf("这是线程%d的第%d圈!\n", (int) pthread_self(), i);
            sleep(1);
        }
    }
    return NULL;
}

int main(int arg, char *args[])
{
    int i = 0;
    int num1 = 10;
    int num2 = 10;
    printf("请输入创建线程的个数:\n");
    scanf("%d", &num1);
    printf("请输入每个线程的圈数:\n");
    scanf("%d", &num2);
    pthread_t thrs[200];
    /*
     * 多线程是并行运行的
     * */
    for (i = 0; i < num1; i++)
    {
        if (pthread_create(&thrs[i], NULL, thread_run, &num2) != 0)
        {
            printf("pthread_create() failed !\n");
            return -1;
        }
    }
    for (i = 0; i < num1; i++)
    {
        /*如果没有pthread_join(),那么控制线程不会等待子线程,会直接退出*/
        pthread_join(thrs[i],NULL);
    }
    return 0;
}

 

相关文章:

  • UML课程复习重点
  • 前端面试通关指南
  • 网络广告计费方式常用术语
  • sails 跨域请求处理 -- config.cors
  • memcache命令
  • openlayers 3监听地图分辨率变化事件
  • Jython开发环境搭建
  • 【树莓派】树莓派网络对时间,时间调整
  • CodeDom系列四--Code生成
  • X 1 BT5kali
  • TCP协议中的三次握手和四次挥手(图解)【转】
  • 转载:年轻人,你着什么急?
  • 例25:二分查找
  • 常识性概念
  • 如何做出健壮的系统设计
  • JavaScript-如何实现克隆(clone)函数
  • Asm.js的简单介绍
  • Babel配置的不完全指南
  • HTTP 简介
  • iOS | NSProxy
  • PHP CLI应用的调试原理
  • React-redux的原理以及使用
  • ViewService——一种保证客户端与服务端同步的方法
  • vue.js框架原理浅析
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 区块链共识机制优缺点对比都是什么
  • 算法-图和图算法
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • MyCAT水平分库
  • # 达梦数据库知识点
  • #微信小程序(布局、渲染层基础知识)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (Python第六天)文件处理
  • (pytorch进阶之路)扩散概率模型
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (原)Matlab的svmtrain和svmclassify
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .Net IE10 _doPostBack 未定义
  • .NET框架
  • /proc/vmstat 详解
  • @软考考生,这份软考高分攻略你须知道
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [2021 蓝帽杯] One Pointer PHP
  • [AIGC] Redis基础命令集详细介绍
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [C/C++]关于C++11中的std::move和std::forward
  • [C++]运行时,如何确保一个对象是只读的