并发编程 原子操作 C (并发原子类)
本文目录导航:
C++并发编程:原子操作
C++并发编程中,原子操作不仅局限于读-修改-写(RMW)操作,同样重要的是loads和stores的原子性。
当我们处理共享内存时,原子操作确保了单步操作的完整性,避免了数据的一半状态被其他线程观察到。
对于store,它保证了写入的完整可见性;对于load,它能获取某一时刻的完整值。
若不使用原子操作,无锁编程变得不可能,因为并发操作共享变量时,写操作必须全程原子化。
C++11引入了数据竞争的概念,当两个线程同时操作共享变量时,非原子操作可能导致数据竞争,导致未定义的行为。
这种竞争可能源于多CPU指令导致的非原子性,如32-bit x86的64-bit赋值需要两条指令,或者ARMv7的strd指令可能分开执行。
即使在单个CPU指令下,内存操作也可能由于内存对齐问题而成为非原子。
C/C++编程中默认假定所有操作是非原子的,除非特定平台或编译器提供保证。
在编写可移植代码时,需要考虑各种平台的特性,例如x86和ARM处理器对整数赋值的原子性依赖于对齐性。
C++11的原子库提供了跨平台的原子loads和stores,即使在某些“想象中的”内存混乱的机器上也能保证原子性。
Relaxed原子操作提供了更少的内存排序保证,但依然保持了操作的原子性,提醒开发者变量可能的并发访问。
因此,使用原子操作如Mintomic库或C++11原子库函数在并发编程中是最佳实践,即使在目标平台的普通操作已原子化的情况下,以确保线程安全和避免数据竞争。
理解原子操作的重要性有助于我们设计高效的无锁数据结构,如无锁哈希表。

STM32+FreeRTOS+lwip+Netconn+TCP Server做并发服务器的编写经验总结
本文基于CSDN网友的分享,总结了在STM32平台上使用FreeRTOS、lwip、Netconn以及TCP Server进行并发服务器编程的实践经验。
以下是对整个移植过程的记录。
目的:实现STM32单片机作为TCP服务器,能够同时与多个客户端进行实时通信,处理多个客户端发来的信息并准确回复。
编写材料准备:1. 代码生成:选择一个已成功实现联网的例子进行移植,以省去从头编写代码的步骤。
以下是生成代码过程的参考,配置仅供参考,如有错误或遗漏,欢迎指出。
2. lwip部分:完成网络协议栈的配置和优化,确保能稳定地进行数据包的接收与发送。
3. FreeRTOS部分:实现任务管理和调度,确保服务器能够高效地处理多个客户端的连接和通信。
2. 代码修改和注意事项:1. 对已有的代码进行必要的修改,以适配TCP服务的实现。
2. 实现并发服务器的搭建,包括:2.A:建立TCP服务器,配置服务器端口和监听机制。
2.B:实现TCP服务器任务,处理客户端连接请求和数据传输。
2.C:实现多客户端接收与处理机制,确保服务器能够同时响应多个客户端。
2.D:在多客户端接收处理中,注意以下事项:确保数据处理的高效性和准确性,合理分配资源,避免阻塞。
3. 编译调试及验证:完成代码的编译,进行调试,确保所有功能都能正常运行。
通过模拟多个客户端连接,验证服务器是否能正确处理和回复每个客户端的信息。
int pthread_mutex_init设置互斥锁的强健属性
在C语言的并发编程中,`pthread_mutex_init`函数用于初始化互斥锁,而`pthread_mutexattr_setrobust_np`是一个高级特性,用于设置互斥锁属性的强健性。
此函数在#include 中定义,其原型为:int pthread_mutexattr_setrobust_np(pthread_mutexattr_t *attr, int *robustness);只有在支持`_POSIX_THREAD_PRIO_INHERIT`标志的环境中,这个函数才可用。
`attr`参数是通过`pthread_mutexattr_init()`创建的互斥锁属性对象,而`robustness`则用于定义属主失败时的行为。
它有两个可能的值:PTHREAD_MUTEX_ROBUST_NP和PTHREAD_MUTEX_STALLED_NP,默认值为PTHREAD_MUTEX_STALLED_NP。
- PTHREAD_MUTEX_ROBUST_NP:当属主失败时,所有后续对`pthread_mutex_lock()`的调用会不确定地被阻塞,直至互斥锁状态恢复。
错误代码为EOWNERDEAD。
- PTHREAD_MUTEX_STALLED_NP:属主失败时,会解除锁并让下一个线程尝试获取,失败者会返回EOWNERDEAD。
新属主需要确保状态一致,如果可能,调用`pthread_mutex_consistent_np()`。
否则,不应调用该函数,而是解除锁,其他等待线程将被唤醒,后续调用将无法获取,返回ENOTRECOVERABLE。
此时可能需要重新初始化互斥锁。
如果出现以下错误,`pthread_mutexattr_setrobust_np()`会返回对应的错误代码:- ENOSYS:不支持或未定义`_POSIX_THREAD_PRIO_INHERIT`。
- ENOTSUP:指定的`robustness`值不受支持。
- EINVAL:`attr`或`robustness`参数无效。
因此,设置互斥锁的强健属性需要谨慎处理,确保正确处理属主失败情况,以维护线程安全。