以前學過c的多線程任務和鎖一些相關知識,由於工作原因做Android去了,很多東西也都忘記的差不多了,現在趁學C++時來重新回顧複習一些,因爲C++是C的加強版很多東西都是兼容的,因此學起來也比較容易。
多線程:多線程是多任務處理的一種特殊形式,多任務處理允許讓電腦同時運行兩個或兩個以上的程序。一般情況下,兩種類型的多任務處理:基於進程和基於線程。
- 基於進程的多任務處理是程序的併發執行。
- 基於線程的多任務處理是同一程序的片段的併發執行。
多線程的優點:
- 無需跨進程邊界;
- 程序邏輯和控制方式簡單;
- 所有線程可以直接共享內存和變量等;
- 線程方式消耗的總資源比進程方式好;
多線程的缺點:
- 每個線程與主程序共用地址空間,受限於2GB地址空間;
- 線程之間的同步和加鎖控制比較麻煩;
- 一個線程的崩潰可能影響到整個程序的穩定性;
- 線程能夠提高的總性能有限,而且線程多了之後,線程本身的調度也是一個麻煩事兒,需要消耗較多的CPU;
線程互斥鎖:
由於多線程是共享進程資源,併發執行。當某個線程訪問資源時,其它線程就不可以訪問,只能等到該線程運行完這片段後才纔可以運行。這個需要lock。
鎖的實現:
pthread_mutex_t mutex1; //mutex1聲明格式:
pthread_mutex_init(&mutex1,NULL); //初始化互斥鎖
pthread_mutex_lock(&mutex1); //加鎖
pthread_mutex_trylock(&mutex1);//試着去加鎖
pthread_mutex_unlock(&mutex1); //去鎖
pthread_mutex_destroy(&mutex1); //釋放鎖資源。
示例(鏈接-lpthread):
#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;
pthread_mutex_t mutex1 ;
void *myid1(void *arg)
{
pthread_mutex_lock(&mutex1); //上鎖
int a = *((int *)arg);
for(int i = 0; i < 5;i++)
{
// sleep(1);
cout<<"__"<<a<<"__mydi_1111"<<endl;
}
pthread_mutex_unlock(&mutex1); //開鎖
}
void *myid2(void *arg)
{
pthread_mutex_lock(&mutex1);
int a = *((int *)arg);
for(int i = 0; i < 5;i++)
{
// sleep(1);
cout<<"__"<<a<<"__myid_2222"<<endl;
}
pthread_mutex_unlock(&mutex1);
}
void *myid3(void *arg)
{
pthread_mutex_lock(&mutex1);
int a = *((int *)arg);
for(int i = 0; i < 5; i++)
{
// sleep(1);
cout<<"__"<<a<<"__myid_3333"<<endl;
}
pthread_mutex_unlock(&mutex1);
}
int main()
{
pthread_t id1,id2,id3;
int a = 1;
int b = 2;
int c = 3;
pthread_mutex_init(&mutex1,NULL);//初始化互斥鎖
pthread_create(&id1,NULL,myid1,(void*)&a);
pthread_create(&id2,NULL,myid2,(void*)&b);
pthread_create(&id3,NULL,myid3,(void*)&c);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_join(id3,NULL);
pthread_mutex_destroy(&mutex1);
return 0;
}
待續...