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