Bote de lenguaje C 3: use software puro para reemplazar Mutex mutex-multithreading

I. Introducción

En el artículo anterior, se introdujo un algoritmo de software puro para realizar la función de protección de la sección crítica Enlace del artículo: Bote de lenguaje C 2: Use software puro para reemplazar el mutex mutex .

En primer lugar, aclare: si el mutex proporcionado por el sistema operativo puede lograr las funciones que necesito, definitivamente usaré el mutex. La razón por la que se introduce el algoritmo de Peterson es principalmente porque es más interesante y pequeño , que puede tráenos algunas ideas fuera de la programación "normativa" .

También hay algunos amigos en el fondo que han publicado algunos comentarios sobre este algoritmo y mientras tengan buenas ideas, temen no pensar en ello.

Uno de mis amigos mencionó que este algoritmo solo se puede usar en 2 subprocesos. ¿Hay otros algoritmos similares que se puedan usar en varios subprocesos ?

Después de salir del trabajo por la noche, ¡me tomé un momento para encontrar el algoritmo a continuación y compartirlo!

Dos, algoritmo de Micha Hofri

No encontré un nombre para este algoritmo, ¡así que llamemos a este algoritmo por el nombre del autor por el momento!

Captura de pantalla del algoritmo:

Desde el código principal del algoritmo, el algoritmo de Hofri extiende principalmente el algoritmo de Peterson, utilizando dos matrices de variables globales para controlar qué hilo puede ingresar a la sección crítica.

El argumento a favor de este algoritmo es más complicado , y son todas pruebas matemáticas El artículo está aquí: Prueba de un algoritmo de exclusión mutua: un ejemplo clásico , publicado en 1989. Los amigos interesados ​​pueden estudiar en sus propios cerebros.

Tres, código de prueba

// 线程操作的资源
static int num = 0;

// 创建 10 个线程
#define THREAD_NUM      10

// 这 2 个全局变量控制算法
int flag[THREAD_NUM] = {0 };
int turn[THREAD_NUM - 1] = {0};

// 这是线程函数
void *thread_routine(void *arg)
{
    int index = *(int *)arg;

    for (int i = 0; i < 10000; ++i)
    {
        for (int j = 1; j < THREAD_NUM - 1; j++)
        {
            flag[index] = j;
            turn[j] = index;
    L:
            for (int k = 1; k < THREAD_NUM; ++k)
            {
                if (k == index) continue;
                if ((flag[k] >= j) && turn[j] == index)
                    goto L;
            }

        }

        flag[index] = THREAD_NUM;
        
        // 关键代码段
        num++;
        
        flag[index] = 0;
    }
    return NULL;
}

void test()
{
    // 用来传递线程的索引
    int index[THREAD_NUM] = {0};
    
    创建多个线程,执行同一个函数
    pthread_t t[THREAD_NUM];
    for (int i = 0; i < THREAD_NUM; ++i)
    {
        index[i] = i;
        pthread_create(&t[i], NULL, thread_routine, &index[i]);
    }
}

Compilar y ejecutar Después de que se ejecuten todos los hilos, la variable num de recurso compartido puede obtener el resultado correcto.

Cuatro, resumen

Permítanme repetir lo que dije al principio del artículo. El algoritmo aquí solo muestra que puede completar la función de proteger la sección crítica. Sin embargo, en proyectos reales, realmente no se recomienda usarlo así. Después de todo, ¡la mantenibilidad del código es muy importante!



Lectura recomendada

[Lenguaje C]
1. Puntero del lenguaje C: desde el principio subyacente hasta habilidades sofisticadas, con imágenes y códigos para ayudarlo a explicarlo en profundidad
2. El principio de depuración subyacente de gdb original es muy simple
3. Análisis paso a paso: cómo usar C para lograr la programación orientada a objetos
4. Un arma para mejorar la compulsión de código: definición de macro, desde la entrada hasta el abandono
5. Use setjmp y longjmp en lenguaje C para implementar la captura de excepciones y la co-rutina

[Diseño de la aplicación]
1. Todos dicen que la arquitectura del software debe dividirse en capas y en módulos, y cómo hacerlo (1)
2. Todos dicen que la arquitectura del software debe dividirse en capas y en módulos, y cómo hágalo (2)
3. Desarrollo de pasarela de IoT:
proceso de diseño basado en bus de mensajes MQTT (Parte 1) 4. Desarrollo de pasarela de IoT: proceso de diseño basado en bus de mensajes MQTT (Parte 2)
5. Mi método favorito de comunicación entre procesos-mensaje autobús

[Sistema operativo]
1. ¿Por qué las naves espaciales y los misiles prefieren utilizar microcontroladores en lugar de sistemas integrados?

[Internet de las cosas]
1. Esas cosas sobre el cifrado y los certificados
2. Profundice en el lenguaje de secuencias de comandos LUA, le permitirá comprender completamente el principio de depuración

[Tonterías] 1. Basado
en mi experiencia profesional fallida: algunos consejos para los técnicos que son nuevos en el lugar de trabajo

Supongo que te gusta

Origin blog.csdn.net/u012296253/article/details/115366917
Recomendado
Clasificación