热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux子线程

线程和进程的区别是不同享栈空间,其他的数据都是同享的所以在子线程中要转数据到主线程中就要用全局变量线程的信息所以栈保存的一,线程的创建和主线程和子线程的

这里写图片描述


  1. 线程和进程的区别是不同享栈空间,其他的数据都是同享的
  2. 所以在子线程中要转数据到主线程中就要用全局变量
  3. 线程的信息所以栈保存的

这里写图片描述


一,线程的创建和主线程和子线程的通信

1,创建子线程的操作
参数一:子线程id
参数二:事件
参数三:回调函数
参数四:回调函数的参数

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

2,退出子线程的的函数

参数: 传数据到主线程中指针 必须是全局变量
这是因为线程是不同享栈空间的

void pthread_exit(void *retval);

3,阻塞函数的使用
参数一:子线程id
参数二:子线程传递的数据

int pthread_join(pthread_t thread, void **retval);

4,终止线程的操作

int pthread_cancel(pthread_t thread);void pthread_testcancel(void);

5,子线程分离的操作函数

int pthread_detach(pthread_t thread);

线程创建转换数据

/*************************************************************************> File Name: pthread_create_join_exit.c> Author: songli> QQ: 2734030745> Mail: 15850774503@163.com> CSDN: http://my.csdn.net/Poisx> github: https://github.com/chensongpoixs> Created Time: Mon 23 Oct 2017 11:54:14 PM CST************************************************************************/#include
#include
#include
#include
#include
#include
#include
#include
#include
#include typedef struct
{int age;char name[64];
}Student;//子线程中在栈中的数据要定义到全局变量中
Student p;
void *pthread_call(void *args)
{//类型转换Student *ptr = (Student *)args;printf("age :%d, name:%s\n", ptr->age, ptr->name);//子线程转主线程中数据p.age = 21;strcpy(p.name, "杨艳");pthread_exit((void*)&p);
}int main(int argc, char *argv[])
{//线程pidpthread_t tpid;int ret;Student stu;stu.age = 23;strcpy(stu.name, "陈丽");//创建子线程 发送消息到子线程中ret = pthread_create(&tpid, NULL, pthread_call, (void *)&stu );if (ret != 0){printf("create phtread error:%s\n", strerror(ret));return -1;}//接收子线程的数据Student *pstr;void *ptr;//设置阻塞事件pthread_join(tpid, &ptr);pstr = (Student *)ptr;printf("age:%d, name:%s\n", pstr->age, pstr->name);return 0;
}

这里写图片描述


子线程的分离的操作

/*************************************************************************> File Name: phread_create_petach.c> Author: songli> QQ: 2734030745> Mail: 15850774503@163.com> CSDN: http://my.csdn.net/Poisx> github: https://github.com/chensongpoixs> Created Time: Tue 24 Oct 2017 12:18:17 AM CST************************************************************************/#include
#include
#include
#include
#include
#include
#include
#include
#include #define PETACH 1
#define NUPETACH 0void *pthread_call(void *args)
{printf("陈丽\n");pthread_exit(NULL);
}int main(int argc, char *argv[])
{//子线程pthread_t tpid;int ret;//创建子线程
#if NUPETACHret = pthread_create(&tpid, NULL, pthread_call, NULL);//设置子线程和主线程分离ret = pthread_detach(tpid);
#endif#if PETACH //================ 定义petach事件 =========================pthread_attr_t atr;//参数线程分离pthread_attr_init(&atr);//设置事件pthread_attr_setdetachstate(&atr, PTHREAD_CREATE_DETACHED);ret = pthread_create(&tpid, NULL, pthread_call, NULL);
#endifif (ret != 0){printf("create pthread :%s\n", strerror(ret));return -1;}if (ret != 0){printf("create detach :%s\n", strerror(ret));return -1;}//================ 现在阻塞事件没有用了 ======ret = pthread_join(tpid, NULL);if (ret != 0){printf("create join :%s\n", strerror(ret));return -1;}
#if PETACHpthread_attr_destroy(&atr);
#endif return 0;
}

这里写图片描述


二,线程同步的操作


  1. pthread_mutex_init()
  2. pthread_mutex_lock()
  3. pthread_mutex_unlock()
  4. pthread_mutex_destroy()

/*************************************************************************> File Name: pthread_create_mutex_lock.c> Author: songli> QQ: 2734030745> Mail: 15850774503@163.com> CSDN: http://my.csdn.net/Poisx> github: https://github.com/chensongpoixs> Created Time: Tue 24 Oct 2017 12:51:15 AM CST************************************************************************/#include
#include
#include
#include
#include
#include
#include
#include
#include
#include #define LOCK 1
#define UNLOCK 0#if LOCKpthread_mutex_t mutex;
#endif#define COUNT 1000int number = 0;void *pid_A(void *args)
{int i, n = 0;for (i = 0; i #if LOCK //加LOCK操作pthread_mutex_lock(&mutex);
#endifn = number;n++;usleep(100);number = n;printf("A:%d\n", number);
#if LOCK //nuLOCK操作pthread_mutex_unlock(&mutex);
#endif}pthread_exit(NULL);
}
void *pid_B(void *args)
{int i, n = 0;for (i = 0; i #if LOCK //加LOCK操作pthread_mutex_lock(&mutex);
#endifn = number;n++;number = n;printf("B:%d\n", number);
#if LOCK //nLOCK操作pthread_mutex_unlock(&mutex);
#endif}pthread_exit(NULL);
}int main(int argc, char *argv[])
{//子线程idpthread_t tpid1, tpid2;
#if LOCK//初始化lockpthread_mutex_init(&mutex, NULL);
#endifint ret;//创建子线程ret = pthread_create(&tpid1, NULL, pid_A, NULL);if (ret != 0){printf("create thread :%s\n", strerror(ret));return -1;}ret = pthread_create(&tpid2, NULL, pid_B, NULL);if (ret != 0){printf("create thread :%s\n", strerror(ret));return -1;}//设置阻塞事件pthread_join(tpid1, NULL);pthread_join(tpid2, NULL);#if LOCK//销毁lockpthread_mutex_destroy(&mutex);
#endifreturn 0;
}

LOCK = 0 的图
这里写图片描述

LOCK = 1 效果图
这里写图片描述


推荐阅读
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
author-avatar
采蘑菇的小熙熙_395
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有