c语言中的多线程的实现

一、多线程的概念及程序实现

1.什么是多线程?

线程:(LWP)线程是轻量级的进程,进程是资源分配的最小单位,线程是调度的最小单位。(同一个进程下)线程共用同一个进程的资源。多线程在切换的时候要比多进程切换的时候效率高。多进程的安全性要比多线程的安全性高,因为进程资源相互独立,线程的资源相关共享(当前进程)。线程在创建的时候几乎不需要内存空间,只是占用了状态和指向正在执行内存的指针的资源。

在使用线程的时候需要安装man手册:sudo apt-get install manpages-posix manpages-posix-dev

2.多线程创建(第三方库函数)

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
              void *(*start_routine) (void *), void *arg);
功能:在进程中创建线程 -pthread 或 -lpthread

#include <pthread.h>
参数:
        @thread:线程号
        @attr:NULL,使用默认属性
        @start_routine:线程体
              void *task (void *arg)
              {
        
              }
        @arg:向线程体传参
返回值:成功返回0,非0就是失败


pthread_t pthread_self(void);
功能:在当前线程内获取线程号

#include <pthread.h>
返回值:成功返回线程号,不会失败

示例:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void *task(void *arg)
{
    //这是线程体
    printf("这是我创建的第一个线程tid = %ld\n",pthread_self());
}
int main(int argc, char const *argv[])
{
    pthread_t tid;
    //注意:这里的tid不能用于接受返回值,因为返回值不是线程号
    //成功返回0,失败返回非零
    //tid只能通过形参来接收
    if((pthread_create(&tid,NULL,task,NULL))!=0){
        fprintf(stderr,"pthread create error\n");
        exit(EXIT_FAILURE);
    }
    printf("这是主线程 = %ld\n",tid);
    while(1);
    return 0;
}

3.多线程执行过程及顺序

时间片轮询,上下文切换

注:线程间如果有全局变量的话,它们共用同一块内存空间,就没有写时拷贝的机制了。

示例:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

int num=10;
void *task(void *arg)
{
    //这是线程体
    printf("这是我创建的第一个线程tid = %ld\n",pthread_self());
    while(1){
        printf("i am thread...\n");
        sleep(1);
    }
    //在线程中不能使用exit或_exit,因为它们会让进程结束,只要进程一结束所有的线程都退出
    //return不会结束一个进程,可以结束线程
    // exit(0);
    return NULL;
}
int main(int argc, char const *argv[])
{
    pthread_t tid;
    if((pthread_create(&tid,NULL,task,NULL))!=0){
        fprintf(stderr,"pthread create error\n");
        exit(EXIT_FAILURE);
    }
    printf("这是主线程 = %ld\n",tid);
    while(1){
        printf("i am process,num = %d\n",num++);
        sleep(1);
    }
    return 0;
}

4.线程的退出

void pthread_exit(void *retval);
功能:退出一个线程(进程是不会结束)

#include <pthread.h>
参数:
        @retval:退出的状态

示例:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

int num=10;
void *task(void *arg)
{
    //这是线程体
    printf("这是我创建的第一个线程tid = %ld\n",pthread_self());
    while(1){
        printf("i am thread num = %d\n",num++);
        sleep(1);
        pthread_exit(NULL);
    }
 
}
int main(int argc, char const *argv[])
{
    pthread_t tid;
    if((pthread_create(&tid,NULL,task,NULL))!=0){
        fprintf(stderr,"pthread create error\n");
        exit(EXIT_FAILURE);
    }
    printf("这是主线程 = %ld\n",tid);
    while(1){
        printf("i am process num = %d\n",num++);
        sleep(1);
    }
    return 0;
}

5.给线程发信号

int pthread_cancel(pthread_t thread);
功能:取消一个线

  • 25
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值