文章目录
- 引言
- 正文
- typedef struct __msgqueue msgqueue_t;
- void *head和void **get_head
- 并发编程中的阻塞模式和非阻塞模式
- 总结
- 引用
引言
- 之前很少用c++,最多就用来进行刷题,并未接触过工程方面的应用。现在因为项目原因,又一次接触了工程上面的编程方式,发现很多东西都不记得了,所以需要复习一下。
- 最致命的是,之前很多库没用过,你给我参考文档,我就能搞明白,但是对于指针这块,chatGPT给我解释了功能,我还是解释不了这个指针的用法,很难受。
正文
- 这部分主要是围绕我在编程过程中,遇到的不同的符号以及操作展开的,并没有具体的主线。
typedef struct __msgqueue msgqueue_t;
- 这个在头文件里面,专门定义了一个结构体__msgqueue,然后他的别名定义为msgqueue_t.具体如下
typedef struct __msgqueue msgqueue_t;
做了两件事情:
- 它声明了一个名为__msgqueue的结构体。在这个阶段,结构体的具体内容还没有定义,所以它通常被称为不完整类型(incomplete type)。
- 它为这个结构体定义了一个别名msgqueue_t,所以你可以使用这个别名来引用结构体,而不需要使用struct关键字。
- 通常,这样的声明会与结构体的实际定义一起使用,如下所示:
typedef struct __msgqueue {int field1;double field2;// 其他成员
} msgqueue_t;
- 这样,你就可以使用msgqueue_t来引用这个结构体,而不需要使用struct __msgqueue。
void *head和void **get_head
-
void *
是通用类型指针,可以指向任何类型的对象- 由于没有类型信息,在使用之前,通常需要将之转换为正确的类型
- head是指向队列头节点的指针
-
void **get_head;
是指向void *
的指针,他的值是另外一个void *
的地址,*get_head
是指向一个指向头节点的void *
指针。- 通常用于指针的数组或链表等数据结构,每一个元素都是一个
void *
指针
- 通常用于指针的数组或链表等数据结构,每一个元素都是一个
-
具体使用如下
-
使用
void *
之前,必须要知道实际指向的数据类型,并在访问之前进行类型转换。
// 这里是假设head2是一个指向整数的void*
int* pInt = static_cast<int*>(head2);
int value = *pInt;// get_head是一个保存head*对象的数组
void* pItem = *get_head; // 获取第一个元素
int* pInt = static_cast<int*>(pItem); // 如果知道它是一个整数
int value = *pInt;
并发编程中的阻塞模式和非阻塞模式
-
阻塞模式
- 描述:
- 生产者往满的队列中放消息时,会陷入阻塞,直到有一个非满的队列
- 消费者从空的队列中取消息时,会陷入阻塞,知道有一个非空的队列
- 特点
- 更有效利用系统资源,没有可用的资源时,对应的线程会挂起,减少无用的轮询
- 描述:
-
非阻塞模式
- 描述
- 生产者往满的队列中放消息时,会返回一个错误值,然后执行别的任务
- 消费者从空的队列中取消息时,会返回一个错误值,然后执行别的任务
- 特点
- 增加系统的响应性和灵活性,使得资源在无法立即获得时,能够去执行别的人物
- 描述
-
提供原因
-
提供阻塞和非阻塞模式的选择可以让这个消息队列更灵活地适应不同的使用场景和需求。
-
在某些情况下,消费者可能希望等待新消息的到来,而不是立即失败。这种情况下,阻塞模式可能更合适。
-
在其他情况下,消费者可能希望在没有新消息时立即执行其他任务。这种情况下,非阻塞模式可能更合适。
-
总结
- 这里很多东西都很细致,都是第一次接触到,学到很多,多做工程,多看别人的代码, 还是对自己的代码能力有提高的。
引用
- chatGPT总结,个人消化