多线程-互斥锁

  • 并发和异步机制,导致线程之间资源竞争的无序性。
  • 由此,引入同步机制,消除复杂性,实现线程之间的数据共享。

异步的定义是什么?

  • 未搞懂

线程同步

  • 思想:同步各个线程对资源的访问,比如:全局变量、文件。
  • 解决方法:锁,获得锁的线程才能完成读写操作,一个原子操作。
  • 原子操作是未了防止CPU执行计算过程中,多条指令被打断,寄存器的值被修改,导致计算错误。

临界资源&临界区

互斥锁

初始化


上锁

解锁

销毁

代码

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>

int gcn = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void * thread_1(void *arg)
{
    int j;
    for (j = 0; j < 100; j++)
    {
        pthread_mutex_lock(&mutex);
        gcn++;
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit((void *)0);
}

void * thread_2(void *arg)
{
    int j;
    for (j = 0; j < 100; j++)
    {
        pthread_mutex_lock(&mutex);
        gcn++;
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit((void *)0);
}

/* main */
int main(void)
{
    pthread_t tid1, tid2;
    int err;

    pthread_mutex_init(&mutex, NULL);
    for (int j = 0; j < 10; j++)
    {
        err = pthread_create(&tid1, NULL, thread_1, (void *)0);
        if (err != 0)
        {
            perror("error pthread create.\n");
            exit(1);
        }
        else
        {
            printf("create thread OK.\n");
        }
        err = pthread_create(&tid2, NULL, thread_2, (void *)0);
        if (err != 0)
        {
            perror("error pthread create.\n");
            exit(1);
        }
        else
        {
            printf("create thread OK.\n");
        }
        err = pthread_join(tid1, NULL);
        if (err != 0)
        {
            printf("wait thread done error:%s.\n", strerror(err));
            exit(1);
        }
        err = pthread_join(tid2, NULL);
        if (err != 0)
        {
            printf("wait thread done error:%s.\n", strerror(err));
            exit(1);
        }
        printf("gcn=%d.\n", gcn);
        gcn = 0;
    }
    pthread_mutex_destroy(&mutex);
    return 0;
}


posted @ 2022-04-15 20:03  starc的miao  阅读(65)  评论(0)    收藏  举报