C语言多线程演示

Posted 菠萝印象威

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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进行链接时,需要找到这个库。

加上后:

执行结果:

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

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

以上是关于C语言多线程演示的主要内容,如果未能解决你的问题,请参考以下文章

C语言多线程演示

在C语言的多线程编程中一般volatile应该用在啥地方?

Java自学-多线程 死锁

c语言的volatile修饰符(转)

C语言多线程

沉淀再出发:再谈java的多线程机制