Maison base de données tutoriel mysql [RTT例程练习] 2.6 互斥锁 mutex

[RTT例程练习] 2.6 互斥锁 mutex

Jun 07, 2016 pm 03:17 PM
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>
Copier après la connexion

结果:
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.
Copier après la connexion


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment s'entraîner à taper avec Kingsoft Typing Guide - Comment s'entraîner à taper avec Kingsoft Typing Guide Comment s'entraîner à taper avec Kingsoft Typing Guide - Comment s'entraîner à taper avec Kingsoft Typing Guide Mar 18, 2024 pm 04:25 PM

De nos jours, de nombreux amis aiment utiliser Kingsoft Typing Assistant, mais la vitesse de frappe affecte sérieusement l'efficacité du travail, je vous apprends donc à vous entraîner à la vitesse de frappe. Alors, comment utiliser Kingsoft Typing Assistant pour vous entraîner à taper ? comment s'entraîner à taper des chiffres avec Kingsoft Typing Assistant. Ce qui suit est décrit, j'espère que cela sera utile à tout le monde. Tout d'abord, ouvrez le logiciel de saisie Kingsoft, puis cliquez sur le bouton (Mise en route) avec votre souris, puis cliquez sur le bouton (Touches numériques) dans une nouvelle fenêtre, puis cliquez sur le bouton (Démarrer à partir de zéro) ci-dessous pour vous entraîner, ou cliquez sur le bouton ( Mode Test), entrez simplement des chiffres pour vous entraîner. De plus, Kingsoft Typing Assistant dispose d'autres fonctions qui peuvent vous aider à mieux taper. 1. Sélectionnez le mode d'entraînement : sur l'interface du logiciel, vous pouvez voir qu'il existe différents modes d'entraînement, tels que "Nouveau

Comment pratiquer la saisie Wubi pour les débutants - Pratique de la saisie avec la méthode de saisie Wubi Comment pratiquer la saisie Wubi pour les débutants - Pratique de la saisie avec la méthode de saisie Wubi Mar 18, 2024 pm 06:30 PM

La saisie Wubi, également connue sous le nom de méthode de saisie Wubi, est une méthode de saisie de caractères chinois efficace. Pour les débutants, maîtriser la saisie Wubi demande un certain temps et de la patience. Ci-dessous, l'éditeur a compilé les méthodes d'apprentissage pour les débutants en saisie Wubi. 1. Comprendre les principes de la police Wubi La police Wubi est un type de police basé sur une police. sur Méthode de saisie des traits et des radicaux. Chaque caractère chinois peut être composé de traits et de radicaux différents. Par conséquent, la clé pour apprendre la police Wubi est de comprendre les règles de combinaison des traits et des caractères racines. Dans la police à cinq traits, il y a cinq traits de base : horizontal, vertical, gauche, droite et pli. Ces traits de base peuvent être combinés en différents radicaux, qui à leur tour peuvent être combinés en caractères chinois complets. 2. Apprenez les radicaux et les positions clés. Dans la police Wubi, chaque lettre correspond à un ou plusieurs radicaux. donc

Erreur de compilation Golang : 'undefined : sync.Mutex' Comment le résoudre ? Erreur de compilation Golang : 'undefined : sync.Mutex' Comment le résoudre ? Jun 24, 2023 pm 06:12 PM

Les erreurs de compilation sont un problème très courant lors du développement avec Golang. Lorsque vous rencontrez l'erreur : "undefined: sync.Mutex", cela signifie que vous essayez d'utiliser un type appelé sync.Mutex, qui n'est pas importé et déclaré correctement. Alors comment résoudre ce problème ? Tout d’abord, nous devons comprendre ce qu’est sync.Mutex. sync.Mutex est un type de verrou dans la bibliothèque standard Golang, qui est utilisé pour implémenter un accès mutuellement exclusif aux sections critiques. en g

Implémentation de l'exclusion mutuelle et de la section critique des fonctions C++ en programmation concurrente ? Implémentation de l'exclusion mutuelle et de la section critique des fonctions C++ en programmation concurrente ? Apr 28, 2024 am 08:42 AM

En programmation concurrente, les mutex et les sections critiques sont utilisés pour empêcher les courses de données. Mutex est une structure de données qui permet à un seul thread d'accéder aux ressources partagées à la fois. L'implémentation spécifique est la suivante : Définissez une classe Mutex avec des balises atomiques. Utilisez la méthode test_and_set() pour verrouiller et la méthode clear() pour déverrouiller. La section critique est une section de code qui ne peut être exécutée que par un seul thread à la fois. L'implémentation spécifique est la suivante : déclarer un mutex. Utilisez le wrapper lock_guard pour accéder aux ressources partagées dans les sections critiques.

Exercices d'expressions régulières en Java Exercices d'expressions régulières en Java Jun 16, 2023 pm 02:36 PM

En Java, les expressions régulières sont l'une des technologies les plus couramment utilisées et peuvent être utilisées dans presque tous les scénarios de traitement de texte, tels que la recherche, l'extraction, l'analyse, le remplacement de texte, etc. Ses puissantes capacités de correspondance peuvent améliorer considérablement l’efficacité du développement, tout en rendant le code plus concis et plus facile à maintenir. Voici quelques exercices d'expressions régulières en Java pour vous aider à maîtriser l'application des expressions régulières. Expression régulière pour la correspondance des caractères chinois : [u4e00-u9fa5] Explication : La plage de valeurs du code Unicode des caractères chinois est comprise entre 4e00 et 9f.

Comment gérer la synchronisation multithread et l'accès mutuellement exclusif dans le développement C# Comment gérer la synchronisation multithread et l'accès mutuellement exclusif dans le développement C# Oct 08, 2023 pm 05:57 PM

Comment gérer la synchronisation multithread et l'accès mutuellement exclusif dans le développement C# nécessite des exemples de code spécifiques. Dans le développement C#, l'utilisation de multithreads peut améliorer la concurrence et les performances du programme. Cependant, l'exécution simultanée de plusieurs threads peut également entraîner certains problèmes, tels qu'une concurrence entre les données et des conflits de ressources. Pour résoudre ces problèmes, nous devons utiliser des mécanismes de synchronisation et d’exclusion mutuelle pour garantir une coopération correcte entre les threads. La synchronisation fait référence à l'exécution de plusieurs threads dans un certain ordre pour assurer la relation de coopération entre les threads. L'exclusion mutuelle signifie qu'un seul thread est autorisé à accéder à une ressource partagée en même temps.

Comment gérer les problèmes de synchronisation multithread et d'exclusion mutuelle dans le développement C# Comment gérer les problèmes de synchronisation multithread et d'exclusion mutuelle dans le développement C# Oct 10, 2023 pm 03:42 PM

Comment gérer les problèmes de synchronisation multithread et d'exclusion mutuelle dans le développement C# nécessite un aperçu d'exemples de code spécifiques : En C#, l'utilisation de multithreads est devenue une exigence de développement courante. Cependant, étant donné que plusieurs threads exploitant simultanément des ressources partagées peuvent provoquer des incohérences ou des conflits de données, des mécanismes de synchronisation et d'exclusion mutuelle doivent être utilisés pour résoudre ces problèmes. Cet article explique comment gérer les problèmes de synchronisation multithread et d'exclusion mutuelle dans le développement C#, et fournit des exemples de code spécifiques. Le concept de synchronisation des threads Lorsque plusieurs threads exploitent des ressources partagées en même temps, des incohérences ou des conflits de données peuvent survenir.

Comment résoudre le problème de la réorganisation des tâches simultanées en langage Go ? Comment résoudre le problème de la réorganisation des tâches simultanées en langage Go ? Oct 09, 2023 pm 10:55 PM

Comment résoudre le problème de la réorganisation des tâches simultanées en langage Go ? En programmation concurrente, l'ordre d'exécution des tâches est souvent incertain, ce qui peut poser certains problèmes, notamment pour les tâches comportant des dépendances. En langage Go, nous pouvons résoudre le problème de la réorganisation des tâches simultanées en utilisant des canaux et des coroutines. Ci-dessous, nous expliquerons en détail comment y parvenir. En règle générale, nous utilisons des canaux pour réaliser la synchronisation des tâches et la communication. Dans le langage Go, les canaux peuvent être utilisés comme primitive de synchronisation de niveau supérieur pour assurer l'ordre d'exécution des tâches. En utilisant tamponné

See all articles