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

【Linux】多线程

进程和线程

进程:一个正在运行的程序。

状态:就绪,运行,阻塞;

线程是进程中的一个执行路径,一个进程中至少有一个主线程(main函数);

有多条执行路径为多线程。

创建一个线程

用pthread_create()创建

记得编译的时候后面加-pthread

多个线程用同一个进程的地址空间

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
void *fun(void *arg)//这是一个线程
{
    for(int i=0;i<5;i++)
    {
        printf(“fun run\n”);
        sleep(1);
}
pthread_exit(“fun over”);//可以返回线程信息给主线程
}
int main()
{
    pthread_t id;
//create执行一次创建一个进程
    pthread_create(&id,NULL,fun,NULL);//创建了一个fun线程

    for(int i=0;i<5;i++)
    {
        printf(“main run\n”);
        sleep(1);
}
char *s = NULL;

pthread_join(id,(void**)&s);
//等待线程返回的信息,如果子线程没有运行完,主线程会被阻塞,可以防止fun线程没有运行完main就结束。
printf(“s=%s\n”,s);//不能用临时变量
exit(0);
}

两个路径同时进行,主函数(主进程)退出,其余进程也会结束,尽量让主函数慢点退出,sleep一下。

当然,用了pthread_join();接收返回信息阻塞可以不用sleep

了解程序的并发运行

并行是特殊的并发,我的虚拟机有4个处理器,所以准确来说这几个线程应该是并行的。

同时创建多个线程并打印自己是第几个线程:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
void *fun(void *arg)//这是一个线程
{
    int index = *(int*)arg;
    printf(“index=%d\n”,index);
sleep(1);
    printf(“index=%d\n”,index);
pthread_exit(NULL);//可以返回线程信息给主线程
}
int main()
{
    pthread_t id[5];
//create执行一次创建一个进程
int i=0;
    for(i=0;i<5;i++)
{
        pthread_create(&id[i],NULL,fun,(void*)&i);//创建线程,传地址
}
for(i=0;i<5;i++)
{
    pthread_join(id[i],NULL);
}

exit(0);
}

运行结果:

程序运行有不确定性(少用多线程)

因为线程获取i是靠i的地址,可能第一次循环的时候这些线程还没来得及获取i的值,到第二个for循环i被置0时才取得i的值,所以线程输出全是0。

获取i的值的速度差不多(同时获取值出现几个相同的),写入缓冲区的速度不一样不一定从0到4。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
int g_count = 1;
void *fun(void *arg)//这是一个线程
{
    for(int i=0;i<1000;i++)
    {
        printf(“g_count=%d\n”,g_count++);
    }
pthread_exit(NULL);//可以返回线程信息给主线程
}
int main()
{
    pthread_t id[5];
//create执行一次创建一个进程
    for(int i=0;i<5;i++)
{
        pthread_create(&id[i],NULL,fun,NULL);//创建线程,传地址
}
for(int i=0;i<5;i++)
{
    pthread_join(id[i],NULL);
}

exit(0);
}

理想的结果应该是5000,每个线程加1000次,但是结果会出现4999,4998等,这是因为两个进程同时执行了++,然后把数值存回去,本来应加两次变成了加一次,导致结果变小了。


http://www.kler.cn/a/2366.html

相关文章:

  • Go 语言常量
  • 谷歌建筑下载
  • Unity3D仿星露谷物语开发7之事件创建动画
  • 1小时放弃Rust(2): 两数之和
  • Linux实现两台服务器之间ssh连接
  • 【C语言】特殊指针汇总
  • OpenCV入门(十八)快速学会OpenCV 17 直线检测
  • 幸福的烦恼:显卡算力太高而pytorch版本太低不支持
  • Power BI利用Python和Sql Server制作实时看板
  • nginx快速入门.跟学B站nginx一小时精讲课程笔记
  • 【百面成神】多线程基础16问,你能坚持到第几问
  • 技术人的管理学-业务管理
  • 扒一扒抖音是如何做线程优化的
  • Markdown常用语法(字体颜色)
  • Python生日蛋糕
  • 网络协议分析期末复习(四)
  • 【vue2】使用vue常见的业务流程与实现思路
  • Docker的可视化界面工具
  • CRC校验算法以及相关实现示例
  • 脱不下孔乙己的长衫,现代的年轻人该怎么办?
  • 百度文心一言正式亮相
  • Linux(网络基础---网络层)
  • 【Python入门第三十五天】Python丨文件打开
  • 论文阅读《Point NeRF:Point-based Neural Radiance Fileds》
  • 【C++进阶】十一、哈希的应用---位图(一)
  • 机器学习算法——决策树详解