C/C++锁以及安全锁

说明:在日常的开发中,常常会涉及到多线程编程,既然是多线程编程,那么自然少不了对共享资源的竞争访问。大多数情况下,我们希望是,同一时刻共享资源只能被一个线程读和写。

该项目通过封装互斥锁,实现了共享资源的独立访问以及互斥锁的自动加锁和释放锁的操作。

案例:未对共享资源上锁

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

历史五千年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值