首页 > 系统相关 >C语言在linux上实现进程线程开发

C语言在linux上实现进程线程开发

时间:2024-11-18 12:14:51浏览次数:3  
标签:linux param C语言 线程 value pthread mutex type

环境

  • 操作系统: Linux

线程

创建线程

  • 创建函数
    #include <pthread.h>

    /*
     * @description 线程创建函数
     * @param tidp 线程标识符
     * @param attr 线程属性指针
     * @param start_rtn 线程执行函数(void *fun(void *))
     * @param arg 线程执行函数的参数
     * @return 0,创建成功;其他,错误码
     */
    int pthread_create(pthread_t *tidp,
                        const pthread_attr_t *attr,
                        (void*)(*start_rtn)(void*),
                        void *arg);
  • 等待线程结束
    #include <pthread.h>

    /*
     * @description 等待线程结束函数
     * @param thread 线程标识符
     * @param retval 获取线程结束返回值
     * @return 0,创建成功;其他,错误码
     */
    int pthread_join(pthread_t thread,
                        void **retval);
  • 示例
    #include <pthread.h>

    //线程执行函数
    void *threadHandler(void *param) {
   
        while (1) {
   
            ...
        }
    }

    int main(void) {
   
        pthread_t threadID;

        //创建线程
        int code = pthread_create(&threadID, NULL, threadHandler, NULL);
        ...
        //等待线程结束
        code = pthread_join(threadID, NULL);
        ...
    }

线程锁

  • 初始化和销毁
    #include <pthread.h>

    /*
     * @description 初始化锁
     * @param mutex 线程互斥锁指针
     * @param attr 互斥锁属性,可以传NULL使用默认值
     * @return 0,成功;其他,错误码
     */
    int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);

    /*
     * @description 销毁互斥锁
     * @param mutex 线程互斥锁指针
     * @return 0,成功;其他,错误码
     */
    int pthread_mutex_destroy(pthread_mutex_t *mutex);
  • 上锁函数,被占用将阻塞线程
    #include <pthread.h>

    /*
     * @description 申请锁
     * @param mutex 线程互斥锁
     * @return 0,创建成功;其他,错误码
     */
    int pthread_mutex_lock(pthread_mutex_t *mutex);
  • 解锁函数
    #include <pthread.h>

    /*
     * @description 解锁
     * @param mutex 线程互斥锁
     * @return 0,创建成功;其他,错误码
     */
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
  • 示例
    #include <pthread.h>

    pthread_mutex_t mutex;
    //线程执行函数
    void *threadHandler(void *param) {
   
        while (1) {
   
            ...
            //申请锁
            pthread_mutex_lock(&mutex);
            ...
            //释放锁
            pthread_mutex_unlock(&mutex);
            ...
        }
    }

原子操作(GCC)

同一个进程中,原子操作是不可被线程间抢占的。一个线程中的原子操作可以实现同步,加快线程间的协调作用,进行无锁化编程。

    type __sync_fetch_and_add (type *ptr, type value);  //获取值后加上value
    type __sync_fetch_and_sub (type *ptr, type value);
    type __sync_fetch_and_or (type *ptr, type value);
    type __sync_fetch_and_and (type *ptr, type value);
    type __sync_fetch_and_xor (type *ptr, type value);
    type __sync_fetch_and_nand (type *ptr, type value);
    type __sync_add_and_fetch (type *ptr, type value);
    type __sync_sub_and_fetch (type *ptr, type value);
    type __sync_or_and_fetch (type *ptr, type value);
    type __sync_and_and_fetch (type *ptr, type value);
    type __sync_xor_and_fetch (type *ptr, type value);
    type __sync_nand_and_fetch (type *ptr, type value);

线程相关知识

  • 线程内部创建变量是不共享的

标签:linux,param,C语言,线程,value,pthread,mutex,type
From: https://blog.csdn.net/qq_26124425/article/details/143853279

相关文章

  • linux驱动开发框架
    前言一、环境搭建不同系统不一样,需要安装内核的开发包,下面是kalilinux的方式,里面的版本号使用uname-r确认sudoaptinstalllinux-image-6.11.2-amd64-dbglinux-headers-6.11.2-amd64二、开发指导1.基本模板1.1.Makefile编写Makefile第一个M要大写,不然也会报错......
  • Linux :进程间通信之管道
    一、进程间通信1.1是什么和为什么1、进程间通信是什么??——>两个或多个进程实现数据层面的交互,但是由于进程独立性的存在,导致通信的成本比较高。2、既然通信成本高,那为什么还要通信呢??——> 在某些场景下我们需要不同进程之间进行(1)基本数据的交互。(2)发送命令。(3)实现某种......
  • linux 安装 docker
    安装yum-utilsyuminstall-yyum-utils\device-mapper-persistent-data\lvm2--skip-broken执行如果报错Cannotfindavalidbaseurlforrepo:base/7/x86_64解决办法编辑/etc/yum.repos.d/CentOS-Base.repo[base]name=CentOS-$releaseve......
  • C语言习题~day16
    1.关于函数调用说法不正确的是:()A.函数可以传值调用,传值调用的时候形参是实参的一份临时拷贝B.函数可以传址调用,传址调用的时候,可以通过形参操作实参C.函数可以嵌套定义,但是不能嵌套调用D.函数可以嵌套调用,但是不能嵌套定义答案解析:A:正确,形参按照值的方式传递,将来形参就......
  • C语言期末必练题目——part 12(编程题)
    10.有一个分数序列:2/1,3/2,5/3,8/5,13/8,……编程求这个序列的前20项之和。#include<stdio.h>voidmain(){ inti,t,n=20; floata=2,b=1,s=0;for(i=1;i<=n;i++){s=s+a/b;t=a;a=a+b;b=t;} printf("sum=%6.2f",s);}11.从键盘输入两个数,求出其最大值(要求使用函数完......
  • linux 下安装 jdk
    linux下安装jdk-11----1----https://download.oracle.com/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz解压安装包tar-xvfopenjdk-11.0.2_linux-x64_bin.tar.gz或tar-xzvfjdk-11.0.23_linux-x64_bin.tar.gz编辑profile文件vim/etc/profileJAVA_HOME=......
  • 低成本玩转Linux开发板(基于NUC980双层板)原理图+PCB分享
    更多电路设计,PCB设计分享及分析,可关注本人微信公众号“核桃设计分享”!由于公司项目需求,一直在找一款能跑Linux系统,外围接口丰富的,关键是必须要有CAN,UART,RMII等接口的芯片(无需LCD,HDMI,eDP)。对于一般的多媒体芯片来说,类似于瑞芯微,全志,海思,NXP等方案上,基本都是BGA封装的居多,CAN......
  • linux常用命令有哪些?
    在Linux中,常用命令有很多,主要包括文件管理、系统管理、网络配置、用户管理等方面。以下是一些常见的Linux命令及其功能:1.文件和目录管理ls列出当前目录下的文件和子目录。常用选项:-l:长格式显示详细信息-a:显示所有文件,包括隐藏文件-h:以人类可读的格式显示文件大小(如K......
  • 70.Linux虚拟机网络有关配置总结
    这个Java开发怎样都绕不开虚拟机服务端的理解学习当初都是模棱两可的学习现在总是要总结的首先如果你的ens33无出现那种什么service开启了还有啥虚拟网卡都开启了大致就简单还原一些默认设置就好了当然还有一种可能就是我当初总结过的https://www.cnblogs.com/gaodiyu......
  • Linux:外观数列
    给定一个正整数n(1≤n≤30),输出外观数列的第n项。注意:整数序列中的每一项将表示为一个字符串。「外观数列」是一个整数序列,从数字1开始,序列中的每一项都是对前一项的描述。前五项如下:111211211111221第一项是数字1描述前一项,这个数是1即“一个1”,记作11......