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:传入函数的参数
注意:
如果是多线程编程,thrd1和argument应该是多个。
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语言多线程演示的主要内容,如果未能解决你的问题,请参考以下文章