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进行链接时,需要找到这个库。

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

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

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于使用C语言实现多线程分解质因数的问题,我可以为您提供一些思路和示例代码。 要实现多线程分解质因数,可以将待分解的数值范围划分为多个子范围,并为每个子范围创建一个线程来进行分解。每个线程独立地处理自己的子范围,最后将结果合并起来。 以下是一个简单的多线程分解质因数的示例代码: ```c #include <stdio.h> #include <pthread.h> // 定义一个结构体用于传递参数 typedef struct { int start; int end; } ThreadParam; // 判断一个数是否为质数 int isPrime(int num) { if (num < 2) { return 0; } for (int i = 2; i * i <= num; i++) { if (num % i == 0) { return 0; } } return 1; } // 线程函数,用于分解质因数 void* factorize(void* arg) { ThreadParam* param = (ThreadParam*)arg; int start = param->start; int end = param->end; for (int num = start; num <= end; num++) { if (isPrime(num)) { printf("%d ", num); } } pthread_exit(NULL); } int main() { int n = 100; // 待分解的数值范围 int num_threads = 4; // 线程数 pthread_t threads[num_threads]; ThreadParam params[num_threads]; int step = n / num_threads; int start = 2; int end = start + step - 1; // 创建线程并分配参数 for (int i = 0; i < num_threads; i++) { params[i].start = start; params[i].end = end; pthread_create(&threads[i], NULL, factorize, (void*)&params[i]); start = end + 1; end = start + step - 1; if (i == num_threads - 2) { end = n; } } // 等待线程结束 for (int i = 0; i < num_threads; i++) { pthread_join(threads[i], NULL); } return 0; } ``` 在上述示例代码中,我们首先定义了一个结构体 `ThreadParam`,用于传递线程的起始和结束参数。然后,我们实现了一个函数 `isPrime` 用于判断一个数是否为质数。 接下来,在 `factorize` 函数中,每个线程独立地分解质因数,并将结果打印出来。在 `main` 函数中,我们创建了指定数量的线程,并为每个线程分配了相应的参数。然后,我们等待所有线程的执行完成。 请注意,上述示例代码只是一个简单的演示,并未对线程的创建和销毁进行充分考虑。在实际应用中,您可能需要更多的线程管理和同步机制来确保线程的安全性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值