嵌入式技术笔记(十六):消息队列和线程

本文详细介绍了Linux系统中的消息队列,包括POSIX和System V消息队列的区别,如接口复杂度、可移植性和消息读取机制。接着,解释了线程的概念、作用、组成、特点以及创建线程的步骤。通过示例代码展示了线程的创建、参数传递、线程等待、线程退出和线程状态。最后,对比了进程和线程的区别,并讨论了线程的状态转换和线程管理的相关函数。

1. 消息队列
传送有格式的消息流
多进程网状交叉通信,实现大规模数据通信
使用内核中的链表(实现机制)

  • posix的消息队列和系统V消息队列的区别
    1、一般来说posix的接口要比systemV的简单,但是systemV的可已移植性更好几乎所有的unix系统都支持。
    2、对posix消息队列的读总是返回最高优先级的最早消息,对systemV消息队列的读则可以返回
    任意指定优先级的消息。
    3、当往一个空队列放置一个消息时,posix消息队列允许产生一个信号或者启动一个线程,systemV消息队列则不提供类似的机制。

消息队列是随内核持续的,所以会产生的现象是:消息队列随内核开始而开始,随内核结束而结束。

2. 线程

  • 什么是线程
    线程是进程的一个实体,它是程序运行的最小单位。

  • 为什么要学习线程(线程的作用)
    1、线程是进程的一个实体,它是程序运行的最小单位,它比进程要消耗更少的资源
    2、能共享地址空间(进程的地址空间)(堆栈:程序栈)

  • 线程由哪些组成
    1、指令指针(指向当前执行的命令)
    2、一个栈(函数栈)
    3、寄存器的集合(状态寄存器:一部分正在运行中的处理器的状态)
    4、一个私有的数据区

  • 线程的特点
    1、线程切换的开销很低(因为线程切换的实质是函数切换)
    2、线程的通信机制简单(由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,即共享进程的地址空间)

  • 多线程切换的实质:函数切换

    线程并不是操作系统中内核所提供的而是由线程库来提供libpthread.a/.so
    线程的调用离不开ios的支持

3. 创建线程

  • int pthread_create()
    int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
    pthread_t *thread:指向线程的指针;
    const pthread_attr_t *attr:创建线程时的属性,一般是NULL,即无属性创建;
    void *(*start_routine) (void *):线程运行的实体函数指针;
    void *arg:线程的参数;
    注意:线程是进程的一个实体,一旦主进程运行结束,线程就会被回收。
  • 代码如下:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

void *func(void *arg)  //次线程,子线程
{
   
   
    while(1)
    {
   
   
        printf("This is a thread\n");
	    sleep(2);
    }
    
}

int main()  
{
   
   
    pthread_t id;
    int ret = pthread_create(&id, NULL, func, NULL);
    if(0 != ret)
    {
   
   
	perror("pthread_create error!");
	exit(0);
    }
    while(1)
    {
   
   
	printf("main thread!\n");
	sleep(2);
    }
    pause();  //pause()表示挂起子线程;或者用while(1);
    return 0;
}

运行结果如下:可以看出主线程和子线程是竞争关系
函数指针无参数

  • 次线程函数的参数是int型时,代码如下
#include 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值