话接上文,在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;
}