futex的使用_fuel开关

futex的使用_fuel开关futex_t::wake实际是一个计数器,防止在调用futex_wait函数前调用futex_wake而出现的死等现象,函数futex只在满足(*addr1==val)时等待。futex_wait函数与futex_wake函数配合使用,前者等待后者唤醒。futex_lock函数与futex_unlock函数配合使用,前者加锁后者解锁。应该是对数据加锁,而不应该对代码

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
futex_t::wake 实际是一个计数器,防止在调用futex_wait函数前调用futex_wake而出现的死等现象,

函数futex只在满足(*addr1 == val)时等待。

futex_wait函数与futex_wake函数配合使用,前者等待后者唤醒。

futex_lock函数与futex_unlock函数配合使用,前者加锁后者解锁。

应该是对数据加锁,而不应该对代码加锁。但这只是测试, 实际编程中不应如此使用。

编译使用如下命令:

g++ -g -W -Wall -Wextra -o mytest main.cpp -lpthread

执行:

./mytest

停止:

Ctrl-C

参考文献:

futex(2),futex(7),Linux内核文档,Linux内核源代码futex.c。

main.cpp:

// 2010年 07月 28日 星期三 13:01:43 CST

// author: 李小丹(Li Shao Dan) 字 殊恒(shuheng)

// K.I.S.S

// S.P.O.T

// linux-2.6.XX/Document/

// linux-2.6.xx/kernel/futex.c

#include <iostream>

#include <cstdlib>

#include <unistd.h>

#include <pthread.h>

#include <errno.h>

#include <linux/futex.h>

#include <sys/syscall.h>

using namespace std;

#define futex(addr1, op, val, rel, addr2, val3)    /

    syscall(SYS_futex, addr1, op, val, rel, addr2, val3)

struct futex_t {

    int wake;

    int lock;

    int wlock;

};

inline static void futex_init(futex_t *);

inline static int futex_wake(futex_t *);

inline static int futex_wait(futex_t *);

inline static int futex_lock(futex_t *);

inline static int futex_unlock(futex_t *);

static void *work_thread(void *);

static void *work_send(void *);

static int count = 0;

int main()

{

    struct futex_t ftx;

    pthread_t tid[6];

    futex_init(&ftx);

    pthread_create(&tid[3], 0, work_send, (void *)&ftx);

    pthread_create(&tid[1], 0, work_thread, (void *)&ftx);

    pthread_create(&tid[2], 0, work_thread, (void *)&ftx);

    pthread_create(&tid[5], 0, work_send, (void *)&ftx);

    pthread_create(&tid[0], 0, work_thread, (void *)&ftx);

    pthread_create(&tid[4], 0, work_send, (void *)&ftx);

    for(int i = 0; i < 6; ++i)

        pthread_join(tid[i], 0);

    return 0;

}

void *work_thread(void *p)

{

    struct futex_t *ftx = (struct futex_t *)p;

    //sleep(2);

    for(;;) {

        futex_wait(ftx);

        futex_lock(ftx);

        cout << pthread_self() << endl;

        cout << “Hello,world!/n”;

        cout << count++ << endl;

        cout << “******************************/n”;

        futex_unlock(ftx);

    }

    return (void *)0;

}

void *work_send(void *p)

{

    futex_t *ftx = (struct futex_t *)p;

    for(int i = 0; i < 3000; ++i)

        futex_wake(ftx);

    return (void *)0;

}

inline static void futex_init(futex_t *ftx)

{

    ftx->lock = 0;

    ftx->wake = 0;

    ftx->wlock = 0;

}

inline static int futex_wake(futex_t *ftx)

{

    __sync_fetch_and_add(&ftx->wake, 1);

    //__sync_lock_test_and_set(&ftx->wake, 1);

    return futex(&ftx->wake, FUTEX_WAKE, 1, 0, 0, 0);

}

inline static int futex_wait(futex_t *ftx)

{

    futex(&ftx->wlock, FUTEX_LOCK_PI, 0, 0, 0, 0);

    int ret = futex(&ftx->wake, FUTEX_WAIT, 0, 0, 0, 0);

    __sync_fetch_and_sub(&ftx->wake, 1);

    futex(&ftx->wlock, FUTEX_UNLOCK_PI, 0, 0, 0, 0);

    return (ret && errno == EWOULDBLOCK ? 1 : ret);

}

inline static int futex_lock(futex_t *ftx)

{

    return futex(&ftx->lock, FUTEX_LOCK_PI, 0, 0, 0, 0);

}

inline static int futex_unlock(futex_t *ftx)

{

    return futex(&ftx->lock, FUTEX_UNLOCK_PI, 0, 0, 0, 0);

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191141.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • peoplesoft笔记「建议收藏」

    peoplesoft笔记「建议收藏」PeopleCode语言结构本主题假定您熟悉一种编程语言,例如C、VisualBasic或Java。在其基础上,PeopleCode语法类似于其他编程语言。但是,PeopleCode语言的某些方面与PeopleTools环境特别相关。例如,定义名称引用使您能够在不使用硬编码字符串文字的情况下引用PeopleTools定义,例如记录定义或页面。其他语言特性,如PeopleCode数据类型和元字符串,反映了PeopleTools和SQL的密切交互。PeopleCode中的

    2022年10月23日
  • hibernate中executeUpdate的缓存问题

    hibernate中executeUpdate的缓存问题解决hibernate批量更新时的缓存问题

    2022年10月20日
  • python复杂网络分析库networkx

    python复杂网络分析库networkx文章目录1简介安装支持四种图绘制网络图基本流程2Graph-无向图节点边属性有向图和无向图互转3DiGraph-有向图一些精美的图例子绘制一个DNN结构图一些图论算法最短路径问题一些其他神经网络绘制工具列表参考1简介networkx是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。利用networ…

    2022年10月25日
  • 电路驱动能力

    电路驱动能力1.在电子电路中为什么有的地方电压会被拉低2,驱动能力是什么意思,如何提高驱动能力在很多资料上看到说驱动能力不够是因为提供的电流太小,为什么不说电压呢?在很多限制的条件都是电流而不是电压,为什么?电压和电流满足欧姆定律,考虑谁不是都一样吗?还有就是,在什么情况下要考虑驱动能力,是不是只有在集成电路输出口要考虑?那你怎么知道这个集成电路驱动能力是不是不够?在平常的电路中(非集成电路I

    2022年5月13日
  • 数据库六大范式(数据库一范式二范式怎么区分)

    1.第一范式(1NF):在关系(表)中,列(属性/字段)不可再分1.每一列属性都是不可再分的属性值,确保每一列的原子性2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据2.第二范式(2NF)消除了非主属性对于主属性的部分函数依赖属性完全依赖于主键。第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的

    2022年4月15日
  • python库之threading

    Thismoduleconstructshigher-levelthreadinginterfacesontopofthelowerlevelpython库之_threadmo

    2021年12月29日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号