LINUX多线程(二)

话接上文,在linux中,并无严格的线程进程区分规则,取而代之的是执行流的概念。

那么问题来了,<pthread>这个线程库是如何实现线程的操作的呢?

 

 可以看出,线程库帮我们向操作系统申请了轻量级的进程,并管理起来,运行完之后再把结果拿回去。

在多线程环境下,往往面临着多个线程修改同一个变量的数据的情况,这时候往往会导致数据混乱,因为CPU做计算时原理如图:

所以,多线程就会面临一个问题,写入混乱.

为了防止此类事件发生,我们需要一个互斥量,以确保每个线程对临界资源(就是很多线程能看见的资源)的处理是原子的(要么不干,干就干完)。所以就有了锁。

锁的定义和初始化及销毁 

加锁解锁 

demo:(一般来说,锁加的粒度越细越好,做好只加在临界区上,但是为了打印的好看一些我就不管这么多了) 

#include<pthread.h>
#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<string>
#include<mutex>
using namespace std;
int global_val=100;
pthread_mutex_t mtx;
//pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;初始化方法之一
void* getnum(void*args)
{
    //pthread_detach(pthread_self());
    const char*name=static_cast<char*>(args);
    while (true)
    {
        pthread_mutex_lock(&mtx);//上锁
        printf("%s\t",name);
        if (global_val > 0)
        {
            global_val--;
            cout << "thread_num:" << pthread_self() << "  global_val:" << global_val << endl;
        }
        else
        {
            cout << "thread_num:" << pthread_self() << "  global_val is 0 now:" << global_val << endl;
            pthread_mutex_unlock(&mtx);//解锁
            break;
        }
        pthread_mutex_unlock(&mtx);//解锁
        sleep(1);
    }
    return nullptr;
}

int main()
{
    pthread_mutex_init(&mtx,nullptr);//初始化锁
    pthread_t tid1,tid2,tid3;
    pthread_create(&tid1,nullptr,getnum,(void*)"i am thread 1");
    pthread_create(&tid2,nullptr,getnum,(void*)"i am thread 2");
    pthread_create(&tid3,nullptr,getnum,(void*)"i am thread 3");

    pthread_join(tid1,nullptr);
    pthread_join(tid2,nullptr);
    pthread_join(tid3,nullptr);
    pthread_mutex_destroy(&mtx);//销毁锁
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值