[RTT例程练习] 2.6 互斥锁 mutex
互斥锁是一种保护共享资源的方法。当一个线程拥有互斥锁的时候,另一个线程若是等待锁,则其就会被挂起,从而保证只有一个线程会操作共享数据。 这里的例子同样有静态锁和动态锁,其差别同之前一样,仅仅是创建和删除的方式不同。 例子中,线程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.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











요즘에는 Kingsoft Typing Assistant를 즐겨 사용하는 친구들이 많지만, 타이핑 속도가 업무 효율에 심각한 영향을 미치기 때문에, 오늘은 Kingsoft Typing Assistant를 사용하여 타이핑 연습하는 방법을 알려드리겠습니다. Kingsoft Typing Assistant를 사용하여 숫자 입력을 연습해 보세요. 다음은 모든 사람에게 도움이 되기를 바랍니다. 먼저 Kingsoft 타이핑 소프트웨어를 열고 마우스로 (시작하기) 버튼을 클릭한 다음 새 창에서 (숫자 키) 버튼을 클릭하고 아래의 (처음부터 시작) 버튼을 클릭하여 연습하거나 ( 테스트 모드) 버튼을 클릭하면 연습을 위해 숫자만 입력하면 됩니다. 또한 Kingsoft Typing Assistant에는 타이핑을 더 잘 연습하는 데 도움이 되는 다른 기능도 있습니다. 1. 연습 모드 선택: 소프트웨어 인터페이스에서 "새로 만들기"와 같은 다양한 연습 모드가 있음을 확인할 수 있습니다.

Wubi 입력 방법으로도 알려진 Wubi 타이핑은 효율적인 한자 입력 방법입니다. 초보자의 경우 Wubi 타이핑을 익히려면 어느 정도의 시간과 인내가 필요합니다. 아래에서 편집자가 Wubi 타이핑 초보자를 위한 학습 방법을 정리했습니다. 1. Wubi 글꼴의 원리 이해 Wubi 글꼴은 글꼴 기반의 유형입니다. on 획과 부수 입력 방법입니다. 각 한자는 서로 다른 획과 부수로 구성될 수 있습니다. 따라서 무비체 학습의 핵심은 획과 어근의 조합규칙을 이해하는 것이다. 5획 글꼴에는 가로, 세로, 왼쪽, 오른쪽, 접기 등 5개의 기본 획이 있습니다. 이러한 기본 획은 서로 다른 부수로 결합될 수 있으며, 이는 다시 완전한 한자로 결합될 수 있습니다. 2. 부수와 키 위치를 알아보세요. Wubi 글꼴에서 각 문자 키는 하나 이상의 부수에 해당합니다. 그러므로

컴파일 오류는 golang을 사용하여 개발하는 동안 매우 일반적인 문제입니다. "정의되지 않음: sync.Mutex" 오류가 발생하면 올바르게 가져오고 선언되지 않은 sync.Mutex라는 유형을 사용하려고 한다는 의미입니다. 그렇다면 이 문제를 해결하는 방법은 무엇입니까? 먼저 sync.Mutex가 무엇인지 이해해야 합니다. sync.Mutex는 중요한 섹션에 대한 상호 배타적 액세스를 구현하는 데 사용되는 golang 표준 라이브러리의 잠금 유형입니다. g 단위

동시 프로그래밍에서는 데이터 경합을 방지하기 위해 뮤텍스와 중요 섹션이 사용됩니다. Mutex는 한 번에 하나의 스레드만 공유 리소스에 액세스할 수 있도록 하는 데이터 구조입니다. 구체적인 구현은 다음과 같습니다. 원자 태그를 사용하여 Mutex 클래스를 정의합니다. 잠그려면 test_and_set() 메서드를 사용하고 잠금 해제하려면 Clear() 메서드를 사용합니다. 임계 섹션은 한 번에 하나의 스레드에서만 실행할 수 있는 코드 섹션입니다. 구체적인 구현은 다음과 같습니다. 뮤텍스를 선언합니다. 중요한 섹션의 공유 리소스에 액세스하려면 lock_guard 래퍼를 사용하세요.

Java에서 정규식은 가장 일반적으로 사용되는 기술 중 하나이며 텍스트 검색, 추출, 분석, 교체 등과 같은 거의 모든 텍스트 처리 시나리오에서 사용할 수 있습니다. 강력한 일치 기능은 개발 효율성을 크게 향상시키는 동시에 코드를 더욱 간결하고 유지 관리하기 쉽게 만듭니다. 다음은 정규식 적용을 익히는 데 도움이 되는 Java의 몇 가지 정규식 연습입니다. 한자 일치를 위한 정규식: [u4e00-u9fa5] 설명: 한자의 유니코드 코드 값 범위는 4e00 ~ 9f입니다.

C# 개발에서 다중 스레드 동기화 및 상호 배타적 액세스를 처리하려면 특정 코드 예제가 필요합니다. C# 개발에서 다중 스레드를 사용하면 프로그램의 동시성과 성능을 향상시킬 수 있습니다. 그러나 여러 스레드를 동시에 실행하면 데이터 경쟁 및 리소스 충돌과 같은 일부 문제가 발생할 수도 있습니다. 이러한 문제를 해결하려면 스레드 간의 올바른 협력을 보장하기 위해 동기화 및 상호 배제 메커니즘을 사용해야 합니다. 동기화는 스레드 간의 협력 관계를 보장하기 위해 특정 순서로 여러 스레드를 실행하는 것을 의미합니다. 상호 배제는 동시에 하나의 스레드만 공유 리소스에 액세스할 수 있음을 의미합니다.

C# 개발에서 다중 스레드 동기화 및 상호 배제 문제를 처리하려면 특정 코드 예제에 대한 개요가 필요합니다. C#에서는 다중 스레드 사용이 일반적인 개발 요구 사항이 되었습니다. 그러나 여러 스레드가 공유 자원을 동시에 운영하면 데이터 불일치나 충돌이 발생할 수 있으므로 이러한 문제를 해결하려면 동기화 및 상호 배제 메커니즘을 사용해야 합니다. 이 문서에서는 C# 개발 시 다중 스레드 동기화 및 상호 배제 문제를 처리하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 스레드 동기화의 개념 여러 스레드가 동시에 공유 자원을 운영할 때 데이터 불일치 또는 충돌이 발생할 수 있습니다.

Go 언어에서 동시 작업 재정렬 문제를 해결하는 방법은 무엇입니까? 동시 프로그래밍에서는 작업의 실행 순서가 불확실한 경우가 많아 특히 종속성이 있는 작업의 경우 문제가 발생할 수 있습니다. Go 언어에서는 채널과 코루틴을 사용하여 동시 작업 재정렬 문제를 해결할 수 있습니다. 아래에서는 이를 달성하는 방법을 자세히 설명합니다. 일반적으로 우리는 작업 동기화 및 통신을 달성하기 위해 채널을 사용합니다. Go 언어에서 채널은 작업의 실행 순서를 보장하기 위해 더 높은 수준의 동기화 기본 요소로 사용될 수 있습니다. 버퍼링을 사용하여
