推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

白嫖|硬核知识 Android NDK C++编程中常用的线程安全编程工具

   2023-08-23 网络整理佚名2130
核心提示:NDK开发者需要学习的一项重要技能,掌握和应用好,可以帮助编写出更安全稳定可靠的多线程程序。中常用的几个线程安全编程工具:是系统中常用的线程安全编程工具,它可以在变量声明时指明该变量被哪个锁保护,这样就清晰地表明了变量的线程安全策略。与等工具组合,可以大大提高多线程代码的安全性和可维护性。作用是在函数入口检查调用线程是否持有指定的锁,如果没有持有,则直接崩溃。是中一个非常有用的线程安全编程工具。

.一叶知秋

线程安全编程工具是NDK开发人员需要学习的一项重要技能。 掌握和应用好它们可以帮助编写出更加安全、稳定、可靠的多线程程序。 事不宜迟,让我们开始吧!

常用的几种线程安全编程工具:

1. GUARDED_BY            - 指明变量被哪个锁保护。2. REQUIRE               - 检查调用线程是否持有指定的锁。3. ASSERT_CAPABILITY     - 检查调用线程是否持有指定的capability。4. SCOPED_CAPABILITY     - 在作用域内暂时持有一个capability。5. mutex_lock_scope      - 在作用域内锁住一个mutex。6. mutex_unlock_scope    - 在作用域内解锁一个mutex。7. lock_guard            - 在作用域内通过RAII机制持有一个锁。8. conditional_variable  - 条件变量,用于线程间协作。9. atomics - 原子操作类,  - 如atomic/atomic_ref。

这些工具可以组合使用,帮助构建线程安全代码,避免死锁、乱序序列和数据争用。 掌握并利用好这些线程安全编程工具是NDK开发人员的一项重要技能,可以大大提高多线程代码的质量和可维护性。

1.

怎么理解随处可见,比如:

State mState GUARDED_BY(mMutex) = State::Idle;

它是系统中常用的线程安全编程工具。 它可以在声明变量时表明该变量受到哪个锁的保护,从而清楚地表明该变量的线程安全策略。 具体来说:

- 是一个互斥对象,用于同步对共享状态的访问。

- 是共享状态变量。

- 用()表示保护。

- 即只有获得锁后才能保证访问的安全。

这样就可以在编译时和运行时检测pair的正确使用,有助于发现线程安全问题。 与其他工具结合,可以大大提高多线程代码的安全性和可维护性。

2.

作用是检查调用线程是否持有函数入口处指定的锁,如果没有则直接崩溃。 使用方法如下:

Mutex leelock;
void updateLeeData() { REQUIRE(leelock);
// 访问共享数据}

总结:

这样,如果在没有持有锁的情况下调用,就会直接崩溃,阻止可能引起数据竞争的代码继续执行。

好处是:

1.可以强制执行锁的正确使用,无需自己编写检查代码。

2. 如果你不小心忘记加锁,你可以立即找到问题而不是隐藏的数据竞争bug。

3. 提高代码的可读性,明确函数需要持有哪些锁。

4、及早发现问题,防止异常情况蔓延。

3.

该功能是检查调用线程是否持有函数入口处指定的,如果不持有则直接崩溃。 In是一种权限控制机制,用于保护对敏感资源的访问。 例如:

ASSERT_CAPABILITY(cap_nice);setpriority(PRIO_PROCESS, 0, -20);

这段代码需要调用线程持有,否则无法设置优先级,避免普通app直接设置。

4.

它的作用是暂时将代码块保存在代码块中以访问受保护的资源。 例如:

void setPriority() {SCOPED_CAPABILITY(cap_sys_nice);// 在此作用域内线程持有cap_sys_nicesetpriority(PRIO_PROCESS, 0, -20);
} // 退出作用域时自动释放Capability

5.

是一个非常有用的线程安全编程工具。 它的作用是自动获取和释放代码块中的互斥体。 例如:

Mutex mu;void f() {mutex_lock_scope ml(mu); // 获取锁// 此作用域内可以安全访问受mutex保护的共享资源} // 退出作用域时自动释放锁

6.

它的作用是自动释放代码块中已经持有的互斥量(mutex)。 如何使用:

Mutex mu;mu.lock(); {mutex_unlock_scope uu(mu); // 释放锁
// 此作用域内无法访问受mutex保护的共享资源
} // 退出作用域时自动重新获取锁

掌握并利用好这些线程安全编程工具是NDK开发人员的一项重要技能,可以大大提高多线程代码的质量和可维护性。 这些工具是强大的多线程编程能力的重要支撑。

7.

是一个非常有用的线程同步原语,它用于当线程需要等待某个条件满足时阻塞自身,并在满足条件时被其他线程通知唤醒。 通常与互斥量结合使用。

基本用法是:

1、线程A首先使用互斥锁来锁定共享数据。

2. 调用的 wait() 方法将线程 A 放入等待队列并解锁互斥体。

3、线程B改变条件后,调用()唤醒等待队列中的一个线程。

4、线程A被唤醒,加锁互斥体后,可以检查条件是否满足。 使用它比睡眠和等待效率更高,并且可以避免轮询造成的资源浪费。

.一叶知秋

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON