多线程--同步(概述)

线程同步的方法一般有以下几种,vc下实现方法有sdk, 和MFC封装类两种

1临界区(Critical Section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 

2互斥量(Mutex):为协调共同对一个共享资源的单独访问而设计的。 

3信号量(Semaphores):为控制一个具有有限数量用户资源而设计。 

4事 件(Event):
用来通知线程有一些事件已发生,从而启动后继任务的开始。

区别与联系:

 1. 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。 

  2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。 

  3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。
(其它3种方式相当有独占资源,而信号灯可以对资源使用量进行计数)

互斥量(Mutex),信号灯(Semaphore),事件(Event)作为内核对象,可以在多个进程的线程间进行同步,但耗费资源较多。
临界区耗费资源较少,在同一个进程同的多线程程序应该首选之。
但应该注意到,当有多个临界区时,要注意死锁的发生。因为临界区无法设置等待超时。

 
### RT-Thread 操作系统中的线程同步方法与机制 #### 线程同步的重要性 为了确保多个线程之间能够有序协作并防止数据竞争条件,在实时操作系统中引入了各种同步原语。这些工具帮助开发者编写更可靠的应用程序。 #### 同步机制概述 RT-Thread 提供了几种不同的线程同步手段,主要包括但不限于: - **信号量 (Semaphore)**:作为一种经典的进程间通信(IPC)机制,允许一个或多个线程等待特定事件的发生[^4]。 - **互斥锁 (Mutex)**:专门设计用来保护共享资源免受并发访问的影响。它不仅提供了基本的锁定/解锁操作,还支持所有权概念以及优先级继承算法来避免死锁情况发生[^2]. - **事件集 (Event Flags Group)**:允许多个线程基于一组布尔标志的状态变化而协调工作;适合处理复杂条件下唤醒需求场景下的任务调度问题[^1]. - **邮箱 (Mailbox)** 和 **消息队列 (Message Queue)** :虽然主要用于传递数据结构体指针或者小型固定大小的消息包给另一个接收者, 但在某些情况下也可以作为简单的通知渠道间接起到同步作用. #### 使用示例 - 通过信号量实现线程同步 下面是一个利用二值信号量(`rt_sem_t`)完成两个线程之间的简单同步的例子: ```c #include "rtthread.h" static rt_semaphore_t sem; // 生产者线程入口函数 void producer_thread_entry(void *parameter) { while(1){ /* 执行生产动作 */ // 发送信号量表示已完成生产 rt_sem_release(sem); } } // 消费者线程入口函数 void consumer_thread_entry(void *parameter) { while(1){ // 获取信号量直到有可用的产品为止 rt_sem_take(sem, RT_WAITING_FOREVER); /* 进行消费动作 */ } } ``` 在此案例里,`producer_thread_entry()`负责制造产品并将它们放入缓冲区之后释放信号量; `consumer_thread_entry()`则持续尝试获取该信号量以便确认是否有新物品可供处理.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值