互斥锁是一种保护共享资源的方法。当一个线程拥有互斥锁的时候,另一个线程若是等待锁,则其就会被挂起,从而保证只有一个线程会操作共享数据。 这里的例子同样有静态锁和动态锁,其差别同之前一样,仅仅是创建和删除的方式不同。 例子中,线程2 一开始拥有
互斥锁是一种保护共享资源的方法。当一个线程拥有互斥锁的时候,另一个线程若是等待锁,则其就会被挂起,从而保证只有一个线程会操作共享数据。
这里的例子同样有静态锁和动态锁,其差别同之前一样,仅仅是创建和删除的方式不同。
例子中,线程2 一开始拥有锁,因为线程2的优先级高。而后线程1一开始采用等待10个tick的方式,所以线程1等锁的时候一定会超时。最后线程2 等1秒之后释放锁,然后这时线程1再次试图拥有锁,就能成功拿到锁了。
代码:
#include <rtthread.h> void rt_init_thread_entry(void *parameter) { } static struct rt_mutex static_mutex; static rt_mutex_t dynamic_mutex = RT_NULL; static rt_uint8_t thread1_stack[1024]; struct rt_thread thread1; static void rt_thread_entry1(void *parameter) { rt_err_t result; rt_tick_t tick; /* static mutex demo */ rt_kprintf("thread1 try to get static mutex, wait 10 ticks.\n"); tick = rt_tick_get(); result = rt_mutex_take(&static_mutex, 10); if (result == -RT_ETIMEOUT) { if (rt_tick_get() - tick != 10) { rt_mutex_detach(&static_mutex); return ; } } else { rt_kprintf("thread1 take a static mutex, failed.\n"); rt_mutex_detach(&static_mutex); return ; } /* wait forever */ rt_kprintf("thread1 try to get static mutex, wait forever.\n"); result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER); if (result != RT_EOK) { rt_kprintf("thread1 take a static mutex, failed.\n"); rt_mutex_detach(&static_mutex); return ; } rt_kprintf("thread1 take a static mutex, done.\n"); rt_mutex_detach(&static_mutex); /* dynamic mutex test */ rt_kprintf("thread1 try to get dynamic mutex, wait 10 ticks.\n"); tick = rt_tick_get(); result = rt_mutex_take(dynamic_mutex, 10); if (result == -RT_ETIMEOUT) { if (rt_tick_get() - tick != 10) { rt_mutex_delete(dynamic_mutex); return ; } rt_kprintf("thread1 take dynamic mutex timeout.\n"); } else { rt_kprintf("thread1 take a dynamic mutex, failed.\n"); rt_mutex_delete(dynamic_mutex); return ; } rt_kprintf("thread1 try to take dynamic mutex, wait forever.\n"); result = rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER); if (result != RT_EOK) { rt_kprintf("thread1 take a dynamic mutex, failed.\n"); rt_mutex_delete(dynamic_mutex); return ; } rt_kprintf("thread1 take a dynamic mutex,done.\n"); rt_mutex_delete(dynamic_mutex); } static rt_uint8_t thread2_stack[1024]; struct rt_thread thread2; static void rt_thread_entry2(void *parameter)\ { //rt_err_t result; //rt_tick_t tick; rt_kprintf("thread2 try to take static mutex.\n"); rt_mutex_take(&static_mutex, 10); rt_kprintf("thread2 got static mutex.\n"); rt_thread_delay(RT_TICK_PER_SECOND); rt_kprintf("thread2 release static mutex.\n"); rt_mutex_release(&static_mutex); rt_kprintf("thread2 try to take dynamic mutex.\n"); rt_mutex_take(dynamic_mutex, 10); rt_kprintf("thread2 got dynamic mutex.\n"); rt_thread_delay(RT_TICK_PER_SECOND); rt_kprintf("thread2 release dynamic mutex.\n"); rt_mutex_release(dynamic_mutex); } int rt_application_init() { //rt_thread_t init_thread; rt_err_t result; result = rt_mutex_init(&static_mutex, "smutex", RT_IPC_FLAG_FIFO); if (result != RT_EOK) { rt_kprintf("init static mutex failed.\n"); return -1; } dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_FIFO); if (dynamic_mutex == RT_NULL) { rt_kprintf("create dynamic mutex failed.\n"); return -1; } rt_thread_init(&thread1, "thread1", rt_thread_entry1, RT_NULL, &thread1_stack[0], sizeof(thread1_stack),11,5); rt_thread_startup(&thread1); rt_thread_init(&thread2, "thread2", rt_thread_entry2, RT_NULL, &thread2_stack[0], sizeof(thread2_stack),10,5); rt_thread_startup(&thread2); return 0; }</rtthread.h>
结果:
thread2 try to get static mutex thread2 got static mutex thread1 try to get static mutex, wait 10 ticks. thread1 take static mutex timeout thread1 try to get static mutex, wait forever. thread2 release static mutex thread2 try to get dynamic mutex thread2 got dynamic mutex thread1 take a staic mutex, done. thread1 try to get dynamic mutex, wait 10 ticks. thread1 take dynamic mutex timeout thread1 try to get dynamic mutex, wait forever. thread2 release dynamic mutex thread1 take a dynamic mutex, done.

现在很多朋友喜欢用金山打字通这款软件,那么打字速度快慢严重影响工作效率,所以教大家练习打字速度,那么如何使用金山打字通练打字呢?今天小编就将金山打字通练习打数字教程如下讲述,希望对大家有所帮助。首先,打开金山打字软件然后,鼠标点击(新手入门)按钮接着,在新窗口中点击(数字键位)按钮随后,点击下方的(从头开始)按钮即可练习也可以点击(测试模式)按钮最后,输入数字进行练习就可以了此外金山打字通还有其他功能,能帮助大家更好的练习打字。1.选择练习模式:在软件界面上,您可以看到有不同的练习模式,例如“新

五笔打字,也称为五笔字型输入法,是一种高效的汉字输入方法。对于初学者来说,掌握五笔打字需要一定的时间和耐心,下面小编整理了五笔打字初学者的学习方法,一起来看看吧!一、理解五笔字型的原理五笔字型是一种基于笔画和字根的输入法。每个汉字都可以由不同的笔画和字根组合而成。因此,学习五笔字型的关键是理解笔画和字根的组合规律。在五笔字型中,有五个基本笔画:横、竖、撇、捺、折。这些基本笔画可以组合成不同的字根,而字根又可以组合成完整的汉字。二、学习字根和键位在五笔字型中,每个字母键都对应着一个或多个字根。因此

在使用golang开发过程中,编译错误是很常见的问题。当遇到错误:"undefined:sync.Mutex"时,它意味着你尝试使用一个叫做sync.Mutex的类型,这个类型没有被正确的导入和声明。那如何解决这个问题呢?首先,我们需要了解一下什么是sync.Mutex。sync.Mutex是golang标准库中的锁类型,它用于实现临界区的互斥访问。在g

在并发编程中,互斥和临界区用于防止数据竞争。互斥是一个数据结构,允许一次只有一个线程访问共享资源,具体实现如下:定义一个带有原子标记的Mutex类。使用test_and_set()方法加锁,并使用clear()方法解锁。临界区是一段代码,一次只能有一个线程执行,具体实现如下:声明一个互斥量。使用lock_guard包装器在临界区中访问共享资源。

在Java中,正则表达式是非常常用的技术之一,几乎可以用于任何文本处理场景,如文本搜索、提取、分析、替换等。其强大的匹配能力可以大大提高开发效率,同时可以让代码更加简洁和易于维护。以下是一些Java中的正则表达式练习题,帮助大家熟练掌握正则表达式的应用。匹配中文字符正则表达式:[u4e00-u9fa5]解释:中文字符的Unicode码值范围是从4e00到9f

C#开发中如何处理多线程同步和互斥访问,需要具体代码示例在C#开发中,多线程的使用可以提高程序的并发性和性能。然而,多线程的并发执行也可能导致一些问题,如数据竞争和资源冲突等。为了解决这些问题,我们需要使用同步和互斥机制来确保线程之间的正确协作。同步是指多个线程按照一定的顺序来执行,以确保线程之间的协作关系。互斥是指在同一时间只允许一个线程访问某个共享资源,

C#开发中如何处理多线程同步和互斥问题,需要具体代码示例概述:在C#中,多线程的使用成为了常见的开发需求。然而,由于多线程同时操作共享资源可能导致数据不一致或者冲突的问题,因此需要使用同步和互斥机制来解决这些问题。本文将介绍在C#开发中如何处理多线程的同步和互斥问题,并提供具体的代码示例。线程同步的概念在多线程同时操作共享资源时,可能会出现数据不一致或冲突的

在Go语言中如何解决并发任务重排序问题?在并发编程中,任务的执行顺序往往是不确定的,这可能会导致一些问题,特别是对于有依赖关系的任务。在Go语言中,我们可以通过使用通道和协程来解决并发任务重排序问题。下面我们将详细介绍如何实现。通常情况下,我们使用通道来实现任务的同步和通信。在Go语言中,通道可以作为一种更高级的同步原语来保证任务的执行顺序。通过使用有缓冲的


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SublimeText3 Linux new version
SublimeText3 Linux latest version

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft

Notepad++7.3.1
Easy-to-use and free code editor
