C语言多线程演示

一.线程简介

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

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

多线程作用:
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进行链接时,需要找到这个库。

加上后:
在这里插入图片描述
执行结果:
在这里插入图片描述
结果发现每次执行结果可能不同,这是因为多线程谁先执行用户是不清楚的,取决于系统对线程的调度

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值