列举常用的锁
- SemaphoreSlim:轻量级的信号量,用于控制同时访问资源的线程数量。
- ManualResetEventSlim:手动重置事件,用于线程间的信号通知和同步。
- ReaderWriterLockSlim:读写锁,允许多个线程同时读取共享资源,但只允许一个线程写入资源;通过EnterReadLock和EnterWriteLock方法获取读锁和写锁,通过ExitReadLock和ExitWriteLock方法释放锁。
2025年08月04日
2025年08月04日
在多线程编程中,当多个线程同时访问共享资源(如变量、文件等)时,会出现竞态条件(Race Condition)问题,导致程序的行为不可预测。为了避免这种问题,需要使用互斥锁来保护共享资源的访问。
互斥锁是一种线程同步机制,它保证同一时刻只有一个线程可以访问共享资源,其他线程需要等待该线程释放锁才能继续访问。在C语言中,可以使用标准库提供的pthread_mutex_t结构体来实现互斥锁。
2025年08月04日
悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)是并发控制中常用的两种策略,用于解决多线程环境下的数据竞争问题。
1. 悲观锁:
- 悲观锁的策略是假设并发操作会导致冲突,因此在访问共享资源之前,会先将其锁定,阻止其他线程的访问,确保每个操作的独占性。
2025年08月04日
自动驾驶系统采用多线程并发架构处理传感器数据流、计算任务及外部通信。核心实现包含以下技术模块:
1. 多线程架构设计
主线程负责传感器数据采集与预处理,子线程执行感知决策与控制指令。线程间通过共享内存池交换数据,内存池采用环形缓冲区结构,每个线程分配独立缓冲区段。同步机制使用基于时间戳的版本号校验,避免数据竞争。
2. 任务调度算法
动态优先级队列管理任务执行,优先级由任务类型(感知/控制/通信)和实时性要求(硬实时/软实时)决定。调度器每100ms更新任务优先级,采用斐波那契堆实现O(1)时间复杂度提取最高优先级任务。任务队列分为:
2025年08月04日
2025年08月04日
原始C++标准仅支持单线程编程。新的C++标准(称为C++11或C++0x)于2011年发布。在C++11中,引入了新的线程库。因此运行本文程序需要C++至少符合C++11标准。
2025年08月04日
当程序中使用goroutine来操作一个全局变量时,拿map来举例,同时使用多个协程来向map中写入数据,此时代码可能会报错.
package main
import (
"fmt"
)
var (
result = make(map[int]int, 10)
)
func Strata(num int) {
res := 1
for i := 1; i <= num ; i ++ {
res *= i
}
// 将结果放入map中
result[num] = res
}
// 使用全局变量加锁方式 解决了 并发写入问题,但是 不知道具体 协程什么时候运行结束
// 那么这个问题怎么解决呢?
func main() {
// 这里开启多个协程, 完成这个任务
// 问题1: fatal error: concurrent map writes (存在并发安全问题)
// 问题2: 通过 go build -race main.go >> 拿到main.exe,并运行 >> Found 2 data race(s) 发现有两个存在竞争关系
for i := 1; i <= 20 ; i ++ {
go Strata(i)
}
// 输出结果
for i, v := range result {
fmt.Printf("result[%v]=%v \n", i, v)
}
}