[国嵌攻略][087][多线程程序设计]

线程概念

1.线程就是轻量级的进程。

2.线程与创建它的进程共享代码段和数据段。

3.线程拥有自己独立的栈。

线程特点

线程可以和进程做相同或不同的工作,但是与进程共享资源。

线程互斥

在实际应用中,多个线程往往会访问同一个数据或资源,为避免线程之间相互影响,需要引入线程互斥机制,而互斥锁(mutex)互斥机制就是其中一种。

thread.c

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

pthread_mutex_t mutex;
int task = 0;

void *thread0();
void *thread1();

void main(){
    //创建互斥锁
    pthread_mutex_init(&mutex, NULL);

    //创建子线程
    pthread_t thread[2];

    pthread_create(&thread[0], NULL, thread0, NULL);
    pthread_create(&thread[1], NULL, thread1, NULL);

    //等待子线程
    pthread_join(thread[0], NULL);
    pthread_join(thread[1], NULL);
}

void *thread0(){
    //显示线程
    printf("I am thread0!\n");

    //处理任务
    int i;

    for(i = 0; i < 10; i++){
        //获取互斥锁
        pthread_mutex_lock(&mutex);

        //处理任务
        task++;

        //释放互斥锁
        pthread_mutex_unlock(&mutex);

        //显示任务
        printf("thread0 task:%d\n", task);

        //睡眠等待
        sleep(1);
    }

    //退出线程
    pthread_exit(NULL);
}

void *thread1(){
    //显示线程
    printf("I am thread1!\n");

    //处理任务
    int i;

    for(i = 0; i < 10; i++){
        //获取互斥锁
        pthread_mutex_lock(&mutex);

        //处理任务
        task++;

        //释放互斥锁
        pthread_mutex_unlock(&mutex);

        //显示任务
        printf("thread1 task:%d\n", task);

        //睡眠等待
        sleep(1);
    }

    //退出线程
    pthread_exit(NULL);
}
时间: 2024-12-10 01:54:22

[国嵌攻略][087][多线程程序设计]的相关文章

[国嵌攻略][079][多进程程序设计]

fork.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> void main(){ int pid; pid = fork(); printf("pid is %d\n", pid); exit(0); } vfork.c #include <stdio.h> #include <stdlib.h> #include <sys/types.h>

[国嵌攻略][117][LED驱动程序设计]

LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() leddev.h //设备命令 #define LED_MAGIC 'L' //LED幻数 #define LED_ON _IO(LED_MAGIC, 0) //打开LED #define LED_OFF _IO(LED_MAGIC, 1) //关闭LED leddev.c /***********************************************

[国嵌攻略][091][TCP网络程序设计]

server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #include <stdio.h> #define SERVER_PORT 3333 void main(){ //创建标识 int serverfd; serverfd = socket(AF_INET, SOCK_STREAM, 0); //建立TCP连接 //绑定地址 struct sockadd

[国嵌攻略][164][USB驱动程序设计]

USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.USB client driver:为USB外部设备提供驱动程序 USB设备模型 device(设备)->config(配置)->interface(接口)->endpoint(端点),构成了USB设备的四个层次.一个usb driver(驱动)对应的是一个interface(接口).一个接口

[国嵌攻略][151][nandflash驱动程序设计]

初始化 打开/drivers/mtd/nand/s3c2410.c找到nand flash驱动程序代码,找到模块初始化函数s3c_nand_init,找到platform_driver中的probe函数. 1.使能时钟 2.进行物理地址到虚拟地址转换 3.硬件纠错初始化 4.搜索nand flash 5.注册分区信息 nand flash读操作 nand flash读写函数位于通用驱动/drivers/mtd/nand/nand_base.c.nand flash的读函数位于nand_read的

[国嵌攻略][063][电阻屏驱动程序设计]

/******************************************************************** *名称:touchscreen.c *作者:D *时间:2015.11.23 *功能: * 触摸屏驱动,由于MINI2440采用一线触控,而非四线电阻触控所以触摸屏 * 驱动无法使用. ********************************************************************/ /****************

[国嵌攻略][073][静态函数库设计]

外部函数 Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供. 两者区别 系统调用在Linux内核中位于核心态,而函数库是由工程师提供位于用户态 函数库分类 函数库按照链接方式可以分为静态函数库和动态函数库 存放位置 Linux应用程序使用的主要函数库均存放于/lib,/usr/lib目录下,其中以*.so.*方式命名的是动态函数库,而以*.a方式命名的是静态函数库. 静态链接库的特点 程序所要用到的库函数代码在链接时全部被拷贝到程序中.如果有多个进程在内存中同时运行,并且使用了

[国嵌攻略][070-095][Linux编程函数手册]

第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 <time.h> 1.1.5 返回值 成功:日历时间失败:-1 1.1.6 参数说明 t:不为空的情况下保存返回值   1.2 获取格林威治时间 1.2.1 函数名 gmtime 1.2.2 函数原形 struct tm *gmtime(const time_t *timep) 1.2.3 函数功

[国嵌攻略][155][I2C用户态驱动设计]

用户态驱动模型 用户态驱动模型首先是一个应用程序,其次是在这个用户程序中通过内核调用来驱动设备. IIC通用驱动代码 IIC通用驱动程序的代码在/drivers/i2c/i2c-dev.c中.一次读操作或者一次写操作就是一条消息. EEPROM用户态驱动 IIC通用设备对应/dev/i2c-0设备文件. 1.打开通用设备驱动 2.构造写数据到eeprom的消息 3.使用ioctl写入数据 4.构造从eeprom读数据的消息 5.使用ioctl读出数据 6.关闭设备 配置IIC驱动 make me