黑马《linux系统编程》学习笔记(从76到80)

七十六. 线程同步的思想

七十七. 互斥锁相关的函数

七十八. 使用互斥锁,实现线程同步

首先是 pthread_mutex.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>

#define MAX 10000
// 全局变量
int number;
//创建一把互斥锁
pthread_mutex_t mutex;

// 线程处理函数
void* funcA_num(void* arg)
{
    for(int i=0; i<MAX; ++i)
    {
                //访问全局变量之前加锁
                //如果mutex被锁上了,代码阻塞在当前位置
                pthread_mutex_lock(&mutex);
        int cur = number;
        cur++;
        number = cur;
        printf("Thread A, id = %lu, number = %d\n", pthread_self(), number);
                //解锁
                pthread_mutex_unlock(&mutex);
        usleep(10);
    }

    return NULL;
}

void* funcB_num(void* arg)
{
    for(int i=0; i<MAX; ++i)
    {
                pthread_mutex_lock(&mutex);
        int cur = number;
        cur++;
        number = cur;
        printf("Thread B, id = %lu, number = %d\n", pthread_self(), number);
                pthread_mutex_unlock(&mutex);
        usleep(10);
    }

    return NULL;
}

int main(int argc, const char* argv[])
{
    pthread_t p1, p2;
        //初始化互斥锁
        pthread_mutex_init(&mutex,NULL);

    // 创建两个子线程
    pthread_create(&p1, NULL, funcA_num, NULL);
    pthread_create(&p2, NULL, funcB_num, NULL);

    // 阻塞,资源回收
    pthread_join(p1, NULL);
    pthread_join(p2, NULL);

        //释放互斥锁资源
        pthread_mutex_destroy(&mutex);

    return 0;
}

运行一下

[root@VM_0_15_centos 8Day]# vim pthread_mutex_.c
[root@VM_0_15_centos 8Day]# gcc pthread_mutex_.c -o p_m -std=gnu99 -lpthread
[root@VM_0_15_centos 8Day]# ls
a.out                  p_e  process_r.c     pthread_create.c  pthread_mutex_.c
deamon.c               p_j  process_work.c  pthread_exit.c    pthread_uncle.c
loop_pthread_create.c  p_m  pthread_attr.c  pthread_join.c    setsid.c
[root@VM_0_15_centos 8Day]# ./p_m
Thread A, id = 140197652313856, number = 1
Thread B, id = 140197643921152, number = 2
Thread A, id = 140197652313856, number = 3
Thread B, id = 140197643921152, number = 4
Thread A, id = 140197652313856, number = 5
Thread A, id = 140197652313856, number = 6
Thread B, id = 140197643921152, number = 7
Thread A, id = 140197652313856, number = 8
Thread B, id = 140197643921152, number = 9
Thread B, id = 140197643921152, number = 10
Thread A, id = 140197652313856, number = 11
Thread B, id = 140197643921152, number = 12
Thread A, id = 140197652313856, number = 13
Thread A, id = 140197652313856, number = 14
……………………
……………………
Thread A, id = 140197652313856, number = 1696
Thread B, id = 140197643921152, number = 1697
Thread B, id = 140197643921152, number = 1698
Thread A, id = 140197652313856, number = 1699
Thread B, id = 140197643921152, number = 1700
Thread A, id = 140197652313856, number = 1701
Thread A, id = 140197652313856, number = 1702
Thread B, id = 140197643921152, number = 1703
Thread A, id = 140197652313856, number = 1704
Thread B, id = 140197643921152, number = 1705
Thread B, id = 140197643921152, number = 1706
Thread A, id = 140197652313856, number = 1707
Thread B, id = 140197643921152, number = 1708
Thread A, id = 140197652313856, number = 1709
Thread A, id = 140197652313856, number = 1710
Thread B, id = 140197643921152, number = 1711
Thread A, id = 140197652313856, number = 1712
Thread B, id = 140197643921152, number = 1713
Thread B, id = 140197643921152, number = 1714
Thread A, id = 140197652313856, number = 1715
Thread B, id = 140197643921152, number = 1716
Thread A, id = 140197652313856, number = 1717
Thread A, id = 140197652313856, number = 1718
Thread B, id = 140197643921152, number = 1719
Thread A, id = 140197652313856, number = 1720
Thread B, id = 140197643921152, number = 1721
Thread B, id = 140197643921152, number = 1722
Thread A, id = 140197652313856, number = 1723
Thread B, id = 140197643921152, number = 1724
Thread A, id = 140197652313856, number = 1725
Thread B, id = 140197643921152, number = 1726
Thread A, id = 140197652313856, number = 1727
Thread A, id = 140197652313856, number = 1728
Thread B, id = 140197643921152, number = 1729
Thread A, id = 140197652313856, number = 1730
Thread B, id = 140197643921152, number = 1731

七十九. 学习目标

八十. 互斥锁使用的时候需要注意的问题

 

 

猜你喜欢

转载自blog.csdn.net/garrulousabyss/article/details/85415150