【Linux操作系统】线程的互斥与同步

一、线程互斥

  • 临界资源:多线程执行流共享的资源就叫做临界资源
  • 临界区:每个线程内部,访问临界资源的代码,就叫做临界区
  • 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用
  • 原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成

抢票代码:
一共有5000张票,创建4个线程,最后打印出每个线程抢到的票数

int g_ticket = 5000;
class DataThread
{
   
   
public:
    DataThread(int& ticket, const string& name)
        :_ticket(ticket), _name(name), _total(0)
    {
   
   }

    ~DataThread()
    {
   
   }

    string _name;
    int& _ticket;//全局的
    int _total;
};
void route(DataThread* td)
{
   
   
    while(true)
    {
   
   
        //抢票
        if(td->_ticket > 0)
        {
   
   
            usleep(1000);
            printf("%s is run..., ticket: %d\n", td->_name.c_str(), td->_ticket);
            td->_ticket--;
            td->_total++;
        }
        else 
        {
   
   
            break;
        }
    }
}
const int num = 4;
int main()
{
   
   
    vector<Thread<DataThread*>> threads;
    vector<DataThread*> datas;
    for(int i = 0; i < num; i++)
    {
   
   
        string name = "thread-" + to_string(i+1);
        DataThread* td = new DataThread(g_ticket, name);
        threads.emplace_back(route, td, name);
        datas.emplace_back(td);
    }
    //创建
    for(auto& thread:threads)
    {
   
   
        thread.Satrt();
    }
    //等待
    for(auto& thread:threads)
    {
   
   
        thread.Join();
    }
    //打印每个线程获取的票数
    for(auto& data:datas)
    {
   
   
        cout << data->_name << " total is: " << data->_total << endl;
    }

  
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值