说明:在日常的开发中,常常会涉及到多线程编程,既然是多线程编程,那么自然少不了对共享资源的竞争访问。大多数情况下,我们希望是,同一时刻共享资源只能被一个线程读和写。
该项目通过封装互斥锁,实现了共享资源的独立访问以及互斥锁的自动加锁和释放锁的操作。
案例:未对共享资源上锁
#include <pthread.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <list>
//#include "CLock.h"
using namespace std;
class TaskItem
{
public:
TaskItem()
{
}
TaskItem(int _id)
{
id=_id;
}
void print(int arg) const
{
printf("TaskItem %d was executed by thread %u\n",id,arg);
}
private:
int id;
};
list<TaskItem> items;
bool ready=false;
bool fetchItem(TaskItem&item)
{
if(items.size()==0)
{
return false;
}
const TaskItem&tmp_item=items.front();
usleep(100);
items.pop_front();
item=tmp_item;
return true;
}
bool doTask(int arg)
{
TaskItem item;
if(!fetchItem(item))
{
return false;
}
item.print(arg);
usleep(100);
return true;
}
void *run(void *arg)
{
while(!ready)
{
usleep(100);
}
int tid=*(int *)arg;
while(doTask(tid));
}
int main(int argc, char *argv[])
{
for(int i=1; i<=10; i++)
{
items.push_back(TaskItem(i));
}
pthread_t pid1,pid2;
pthread_create(&pid1,0,run,&pid1);
pthread_create(&pid2,0,run,&pid2);
ready=true;
pthread_join(pid1,0);
pthread_join(pid2,0);
return 1;
}
程序输出:
TaskItem 1 was executed by thread 1394398976
TaskItem 1 was executed by thread 1383909120
TaskItem 3 was executed by thread 1383909120
TaskItem 3 was executed by thread 1394398976
TaskItem 5 was executed by thread 1383909120
TaskItem 5 was executed by thread 1394398976
TaskItem 7 was executed by thread 1383909120
TaskItem 7 was executed by thread 1394398976
TaskItem 9 was executed by thread 1394398976
TaskItem 9 was executed by thread 1383909120
或者
TaskItem 1 was executed by thread 2718865152
TaskItem 2 was executed by thread 2729355008
TaskItem 2 was executed by thread 2718865152
TaskItem 4 was executed by thread 2729355008
TaskItem 4 was executed by thread 2718865152
TaskItem 6 was executed by thread 2729355008
TaskItem 6 was executed by thread 2718865152
TaskItem 8 was executed by thread 2729355008
TaskItem 8 was executed by thread 2718865152
TaskItem 10 was executed by thread 2729355008
程序异常终止。
案例:对共享资源上锁
#include <pthread.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <list>
//包含锁实现头文件
#include "CLock.h"
using namespace std;
class TaskItem
{
public:
TaskItem()
{
}
TaskItem(int _id)
{
id=_id;
}
void print(int arg) const
{
printf("TaskItem %d was executed by thread %u\n",id,arg);
}
private:
int id;
};
CLock itemsLock;//共享资源锁
list<TaskItem> items;
bool ready=false;
bool fetchItem(TaskItem&item)
{
CSafeLock lock(itemsLock);//共享资源安全锁
if(items.size()==0)
{
return false;
}
const TaskItem&tmp_item=items.front();
usleep(100);
items.pop_front();
item=tmp_item;
return true;
}
bool doTask(int arg)
{
TaskItem item;
if(!fetchItem(item))
{
return false;
}
item.print(arg);
usleep(100);
return true;
}
void *run(void *arg)
{
while(!ready)
{
usleep(100);
}
int tid=*(int *)arg;
while(doTask(tid));
}
int main(int argc, char *argv[])
{
for(int i=1; i<=10; i++)
{
items.push_back(TaskItem(i));
}
pthread_t pid1,pid2;
pthread_create(&pid1,0,run,&pid1);
pthread_create(&pid2,0,run,&pid2);
ready=true;
pthread_join(pid1,0);
pthread_join(pid2,0);
return 1;
}
程序输出:
TaskItem 1 was executed by thread 45356800
TaskItem 2 was executed by thread 55846656
TaskItem 3 was executed by thread 45356800
TaskItem 4 was executed by thread 55846656
TaskItem 5 was executed by thread 45356800
TaskItem 6 was executed by thread 55846656
TaskItem 7 was executed by thread 45356800
TaskItem 8 was executed by thread 55846656
TaskItem 9 was executed by thread 45356800
TaskItem 10 was executed by thread 55846656
源码:
https://gitee.com/zhangtongxueruanjiankaifa/lock-and-safety-lock