线程-互斥锁

线程为什么要同步

1 共享资源,多个线程都可对共享资源操作

2 线程操作共享资源的先后顺序不确定

3 处理器对存储的操作一般不是操作

临界区

保证在某一时刻只有一个线程能访问数据的简便方法,在任意时刻只允许一个线程对共享资源进行访问,如果又多个线程试图同时访问临界区,那么在又一个线程进入后,其他所有试图访问因此临界区的线程将被挂起,并一直持续到进入临界区的线程离开,临界区在被释放后,某其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的

临界区的选定

临界区的选定因此可能小,如果选定太大会影响程序的并行处理性能

互斥锁相关函数

初始化互斥锁:

pthread_mutex_init(

    pthread_mutex_t  *mutex,

    const pthread_mutexattr_t *attr

);

销毁互斥锁:

pthread_mutex_destroy(pthread_mutex_t *mutex);

加锁:

pthread_mutex_lock(pthread_mutex_t *mutex);

    mutex:

            没有被上锁,当前线程会将这把锁锁上

            被锁上了:当前线程阻塞(锁被打开之后,线程解除阻塞)

尝试加锁,失败返回,不阻塞

pthread_mutex_trylock(pthread_mutex_t *mutex);

没有加锁的话:当前进程会给这把锁加锁

如果锁上了:不会阻塞,返回

if(pthread_mutex_trylock(&mutex)==0)
// 尝试加锁,并且成功了
// 访问共享资源
{
}
else
// 错误处理
// 或者 等一会,再次尝试加锁
{
}

解锁:

pthread_mutex_unlock(pthread_mutex *mutex);

如果我们想使用互斥锁同步线程:所有的线程都需要加锁

初始化时相当于有了一把锁(1)

pthread_mutex_lock(&mutex)  mutex=1;

操作共享资源的代码之前加锁

pthread_mutex_lock(&mutex);  使用这个函数的时候会判断mutex是否为1,也就是有锁,有锁的话加锁,mutex变为0,如果mutex为0,也就是这把被用了,就会阻塞

临界区。。

pthread_mutex_unlock(&mutex)  --解锁后mutex会变成1


代码(没加锁):

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#define LOOP 5000
int number=0;
void *th_fun(void *sig)
{
    int var;;
    for(int i=0;i<LOOP;i++)
    {
        var=number;
        number=var+1;
        printf("%x---%d\n",(unsigned int)pthread_self(),number);
        usleep(10);
    }
    return NULL;
}
int main()
{
    pthread_t ta,tb;
    pthread_create(&ta,NULL,th_fun,NULL);
    pthread_create(&tb,NULL,th_fun,NULL);
    pthread_join(ta,NULL);
    pthread_join(tb,NULL);
    return 0;
}

会出现数据覆盖的问题

代码(加锁):

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#define LOOP 5000
int number=0;
pthread_mutex_t mutex;
void *th_fun(void *sig)
{
    int var;;
    for(int i=0;i<LOOP;i++)
    {
        pthread_mutex_lock(&mutex);
        var=number;
        number=var+1;
        printf("%x---%d\n",(unsigned int)pthread_self(),number);
        pthread_mutex_unlock(&mutex);
        usleep(10);
    }
    return NULL;
}
int main()
{
    pthread_t ta,tb;
    //初始化互斥锁
    pthread_mutex_init(&mutex,NULL);
    pthread_create(&ta,NULL,th_fun,NULL);
    pthread_create(&tb,NULL,th_fun,NULL);
    pthread_join(ta,NULL);
    pthread_join(tb,NULL);
    pthread_mutex_destroy(&mutex);
    return 0;
}

不会出现问题


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值