c语言多线程演示(代码片段)

菠萝印象威 菠萝印象威     2022-11-24     169

关键词:

一.线程简介

线程:
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数

多线程:
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程作用:
1.达到充分利用CPU的目的
多线程完成cpu内核的快速切换,提高CPU的利用率。

2.提高任务处理的效率
单线程编程对于一个较大的任务来说花费较长时间,多线程会创建多个并行的线程来同时完成任务。

3.验证系统的稳定性
对于测试人员来说,一个稳定的系统必须能负载多线程的场景,那么,多线程就成为验证的必要手段。

二.线程的创建和回收

1.创建线程 pthread_create
格式:
pthread_create(&thrd1, NULL, (void *)&thread_function, (void *) &argument);

说明:
thrd1:线程变量名,被创建线程的标识。
NULL:线程的属性指针,可省略为NULL。
thread_function:函数体,线程需要操作的函数。
argument:传入函数的参数

注意:
如果是多线程编程thrd1argument应该是多个。

2.结束线程 pthread_exit
格式:
pthread_exit(void *retval);
说明:
retval:存放线程结束的退出状态,可以通过这个值来判断线程是否正常退出。

3.线程等待 pthread_join
格式:
pthread_join(thrd1, NULL);
说明:
thrd1:要等待结束的线程的标识
NULL:指针thread_return指向的位置存放的是终止线程的返回状态。

pthread_join作用
1.pthread_create调用成功后,用户是不清楚哪个线程先执行,需要设置线程等待,让这些线程都执行完成后,再执行主线程,否则这些线程还没执行完,主线程就已经退出。
2.pthread_join可以用来回收线程资源,如果在线程结束时没有调用pthread_join可能会造成资源不足的情况。

实例演示:

#include <stdio.h>
#include <pthread.h>
void print(void *thrd) 
     for (int i=0; i<3; i++) 
         printf("%s:%d\\n", (char*)thrd, i);
     
 
int main()

    void* reVal;
    pthread_t thread1, thread2, thread3;
    int ret1, ret2, ret3;
    int res1, res2, res3;
    char *arg1="thread1";
    char *arg2="thread2";
    char *arg3="thread3";
    ret1 = pthread_create(&thread1, NULL, (void*)&print, (void*)arg1);
    ret2 = pthread_create(&thread2, NULL, (void*)&print, (void*)arg2);
    ret3 = pthread_create(&thread3, NULL, (void*)&print, (void*)arg3);

    res1=pthread_join(thread1, &reVal);
    res2=pthread_join(thread2, &reVal);
    res3=pthread_join(thread3, &reVal);

   return 0;

以上是一个简单的示例,创建三个线程打印0~2。
我们来编译一下:
上篇文章讲解了如何使用gcc编译程序
使用gcc编译C程序


发现使用gcc 代码.c编译失败,这里需要注意一下,后面要加上 -lpthread,因为代码里使用了pthread.h里的函数,所以在gcc进行链接时,需要找到这个库。

加上后:

执行结果:

结果发现每次执行结果可能不同,这是因为多线程谁先执行用户是不清楚的,取决于系统对线程的调度

这部分演示了简单的多线程的场景,实际应用中的场景更复杂,而且涉及到资源抢占导致数据不同步的问题,这个问题会在后面再进行讲解,通过锁的机制就可以解决。

c语言多线程演示(代码片段)

一.线程简介线程:线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。多线程:多线程是指程序中包含多个执行流,... 查看详情

java---多线程篇(代码片段)

多线程进程与线程并行与并发多线程的创建和启动Thread类创建线程的两种方式方式一:继承Thread类方式二:实现Runnable接口指定线程的名称,并获取继承方式和实现方式的联系和区别Thread类相关的方法1线程的优先级Thr... 查看详情

linux下c语言实现多线程文件复制(代码片段)

转自:https://www.cnblogs.com/zxl0715/articles/5365989.html1、具体思路把一个文件分成N份,分别用N个线程copy,每个线程只读取指定长度字节大小的内容最后一个线程的源文件所指定的结束位置是文件的实际大小每个线程读取指定源文件部... 查看详情

c++11多线程编程之线程类(代码片段)

C++11之前,C++语言没有对并发编程提供语言级别的支持,这使得我们在编写可移植的并发程序时,存在诸多的不便。现在C++11中增加了线程以及线程相关的类,很方便地支持了并发编程,使得... 查看详情

java多线程实现的三种方式(代码片段)

文章目录实现多线程方式一:继承Thread类方法介绍实现步骤代码演示思考问题实现多线程方式二:实现Runnable接口Thread构造方法实现步骤代码演示实现多线程方式三:实现Callable接口方法介绍实现步骤代码演示三种实现方式... 查看详情

一起talkandroid吧(第三百七十一回:多线程之线程池扩展)(代码片段)

...看官们,大家好,上一回中咱们说的是Android中多线程之线程池回顾的例子,这一回中咱们介绍的例子是多线程之线程池扩展。闲话休提,言归正转。让我们一起TalkAndroid吧!使用步骤看官们,我们在上一章回中... 查看详情

40.c++11多线程(代码片段)

语言级别的多线程=》代码跨平台Windows、linux、macosthread/mutex/condition_variableatomic原子类型,基于CAS操作的原子类型(线程安全)sleep_for本质上都是在调用系统的API一、如何创建启动线程?std::thread定义一个线程对... 查看详情

c语言多线程教程(代码片段)

1、Linux多线程,基本概念2、Linux多线程,线程的分离与结合3、Linux多线程,线程同步4、Linux多线程,线程同步(2)文章目录一、基本概念1、线程是计算机中独立运行的最小单位。进程是分配资源的单位。2... 查看详情

c++11多线程第二篇:线程启动结束创建线程的多个方法:joindetach(代码片段)

2、线程启动、结束、创建线程的多个方法:join、detach2.1范例演示线程运行的开始和结束程序运行起来,生成一个进程,该进程所属的主线程开始自动运行。std::cout<<"C++"<<std::endl;实际上是这个主... 查看详情

多线程线程状态和案例演示(代码片段)

线程的几种状态初始(NEW):新创建了一个线程对象,但还没有调用start()方法运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”阻塞(BLOCKED):表示线程阻塞于锁等待(WAITING):进入该... 查看详情

c++static变量跨平台多线程安全性分析(代码片段)

单例模式编程语言的多线程安全。单例模式开始讨论常见的编程语言,不论强类型弱类型,还是JustInTime(JIT)或AheadofTime(AOT)的语言,都会涉及到设计模式,其中最经典的就是单例模式,有两种基本形式称为 Meyer... 查看详情

linux下c语言简单实现写日志函数(多线程安全)(代码片段)

调用时包含log.h文件后使用LOG函数进行写入日志操作//eg:LOG("[%s][%d]a:%db:%s",__FILE__,__LINE,a,b);log.h//log.h:标准系统包含文件的包含文件//或项目特定的包含文件。#pragmaonce#include<stdio.h>#include<sys/types.h>#include 查看详情

ios装13-之多线程(代码片段)

全栈线程与进程开始之前先问自己几个问题1、大学用C语言写的main函数里只写了helloword,面有线程么2、CPU频率和个数与多线程有什么关系3、进程和线程的关系4、线程的访问权限,它都可以访问哪些东西5、线程同步都有... 查看详情

c++11线程使用(代码片段)

...多线程代码也必须要修改。现在在C++11中只需使用语言层面的thread可以解决这个问题。所需头文件:#include<thread 查看详情

多线程编程c语言版(附代码示例)(代码片段)

点击蓝字关注我们本文探讨PODIX线程相关内容。线程的概念什么是多线程,提出这个问题的时候,我还是很老实的拿出操作系统的书,按着上面的话敲下“为了减少进程切换和创建开销,提高执行效率和节省资源&#... 查看详情

c语言多线程编程semaphore信号量(信号灯)是什么?如何使用?(代码片段)

文章目录semaphore信号量、信号灯定义目的分类函数使用sem_init创建信号量sem_post信号量的值加1sem_wait信号量的值加-1sem_destroy用完记得销毁哦~示例程序1:进行三个下载任务,但是最多选择同时执行二个(创建两个线程&#... 查看详情

初识多线程(代码片段)

初识多线程前言一、操作系统1.冯诺依曼体系结构2.操作系统二、进程2.1操作系统管理进程2.2进程的组成2.3时间片2.4并行和并发2.5内核态和用户态2.6进程状态三、多线程3.1线程是什么?3.2进程和线程的区别3.3Java实现多线程3.4... 查看详情

java示例代码_演示java多线程可见性问题

java示例代码_演示java多线程可见性问题 查看详情