thread相关——互斥锁

互斥锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源。可以保证以下三点:
原子性:把一个互斥量锁定为一个原子操作,这意味着操作系统(或pthread函数库)保证了如果一个线程
锁定了一个互斥量,没有其他线程在同一时间可以成功锁定这个互斥量。
唯一性:如果一个线程锁定了一个互斥量,在它解除锁定之前,没有其他线程可以锁定这个互斥量。
非繁忙等待:如果一个线程已经锁定了一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程将
被挂起(不占用任何cpu资源),直到第一个线程解除对这个互斥量的锁定为止,第二个线程则被唤
醒并继续执行,同时锁定这个互斥量。
从以上三点,我们看出可以用互斥量来保证对变量(关键的代码段)的排他性访问。
from http://blog.chinaunix.net/uid-21411227-id-1826888.html

从网上找的代码,但是自己还不是很能理解。所以根据这个代码进行研究分析。。。
下面的代码 from http://blog.csdn.net/hitwengqi/article/details/8015646

#include <stdio.h>
#include <Windows.h>
#include<iostream>
#include <pthread.h>
#pragma comment(lib, "pthreadVC2.lib")     //必须加上这句
using namespace std;
#define NUM_THREADS 5  

int sum = 0;//定义个全局变量,让所有线程进行访问,这样就会出现同时写的情况,势必会需要锁机制;  
pthread_mutex_t sum_mutex;  

void* say_hello(void* args)  
{  
    cout << "hello in thread " << *((int *)args) << endl;  
    pthread_mutex_lock (&sum_mutex);//修改sum就先加锁,锁被占用就阻塞,直到拿到锁再修改sum;  
    cout << "before sum is " << sum << " in thread " << *((int *)args) << endl;  
    sum += *((int *)args);  
    cout << "after sum is " << sum << " in thread " << *((int *)args) << endl;  
    pthread_mutex_unlock (&sum_mutex);//完事后解锁,释放给其他线程使用;  

    pthread_exit(0);//退出随便扔个状态码  
    return NULL;
}  

int main()  
{  
    pthread_t tids[NUM_THREADS];  
    int indexes[NUM_THREADS];  
    //下三句是设置线程参数,但是没明白有什么必要性。。。。
    pthread_attr_t attr;   //线程属性结构体,创建线程时加入的参数  
    pthread_attr_init(&attr);   //初始化  
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);  //是设置你想要指定线程属性参数,这个参数表明这个线程是可以join连接的,join功能表示主程序可以等线程结束后再去做某事,实现了主程序和线程同步功能  

    pthread_mutex_init (&sum_mutex, NULL);//这句是对锁进行初始化,必须的;  

    for(int i = 0; i < NUM_THREADS; ++i)  
    {  
        indexes[i] = i;  
        int ret = pthread_create( &tids[i], &attr, say_hello, (void *)&(indexes[i]) );//5个进程你们去修改sum吧哈哈;  
        if (ret != 0)  
        {  
           cout << "pthread_create error: error_code=" << ret << endl;  
        }  
    }  

    pthread_attr_destroy(&attr);//删除参数变量  

    void *status;  
        for (int i = 0; i < NUM_THREADS; ++i)  
    {  
                int ret = pthread_join(tids[i], &status);  
        if (ret != 0)  
        {  
            cout << "pthread_join error: error_code=" << ret << endl;  
        }  
    }  

    cout << "finally sum is " << sum << endl;  

    pthread_mutex_destroy(&sum_mutex);//注销锁,可以看出使用pthread内置变量神马的都对应了销毁函数,估计是内存泄露相关的吧;  
    system("pause");
    return 0;
}  

运行结果如下:

hello in thread hello in thread 1hello in thread 3hello in thread 2hello in thre
ad 40


before sum is 0
 in thread 4
after sum is 4
 in thread 4
before sum is 4 in thread 2
after sum is 6 in thread 2
before sum is 6 in thread 1
after sum is 7 in thread 1
before sum is 7 in thread 3
after sum is 10 in thread 3
before sum is 10 in thread 0
after sum is 10 in thread 0
finally sum is 10
请按任意键继续. . .
//多线程的顺序是混乱的,混乱就是正常;只要sum访问及修改是正常的,就达到多线程的目的了,运行顺序不能作为参照;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Freertos互斥锁是一种用于保护共享资源的机制。在多任务并发执行的环境,当多个任务同时访问某个共享资源时,可能会发生竞争条件的问题。为了避免这种问题,可以使用互斥锁来确保同一时间只有一个任务可以访问共享资源。 在引用的代码,osMutexWait函数用于获得互斥锁,使得当前任务可以访问共享资源。而osMutexRelease函数用于释放互斥锁,让其他任务可以继续访问共享资源。 在引用提到,原子操作是指不会被线程调度机制打断的操作,而互斥锁可以用于保证复杂数据结构的原子性。当一个任务获得了互斥锁时,其他任务需要等待,直到互斥锁被释放才能继续执行。 在引用的代码,通过使用互斥锁来保护按键操作的共享资源。在按键被按下时,首先进行了消抖操作,然后通过osMutexWait函数获得互斥锁,确保在访问共享资源期间不会被其他任务打断。当访问完成后,使用osMutexRelease函数释放互斥锁,让其他任务可以继续访问共享资源。 综上所述,Freertos互斥锁是一种用于保护共享资源的机制,通过获得和释放互斥锁来确保同一时间只有一个任务可以访问共享资源,从而避免竞争条件的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [FREERTOS学习笔记五-互斥锁](https://blog.csdn.net/qq_46384359/article/details/122775987)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [freertos————互斥锁](https://blog.csdn.net/qq_39854159/article/details/120016495)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值