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);

}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 数据库按条件查询语句_sql多条件筛选语句

    数据库按条件查询语句_sql多条件筛选语句文章目录前言一、单条件查询二、多条件查询前言1.熟练掌握where子句各类运算符的使用2.熟练掌握多条件查询and、or的使用一、单条件查询在SQL中,insert、update、delete和select后面都能带where子句,用于插入、修改、删除或查询指定条件的记录SELECTcolumn_nameFROMtable_nameWHEREcolumn_name运算符value语句:select*fromtable_namewherecolumn_name运

  • 高通平台dtb文件的加载过程「建议收藏」

    高通平台dtb文件的加载过程「建议收藏」高通平台dtb文件的加载过程高通平台对dts的两种打包方式zImage-dtbdt.imgzImage-dtb方式zImage-dtb的编译二进制文件查看lk的加载过程代码分析dt.img方式dt.img的编译lk的加载过程新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyP…

    2022年10月28日
  • linux(8)Linux 查看端口占用情况[通俗易懂]

    linux(8)Linux 查看端口占用情况[通俗易懂]前言平常使用linux,我们经常需要查看哪个服务占用了哪个端口,接下来就为大家介绍了2种Linux查看端口占用情况可以使用lsof和netstat命令。1.lsof-i:端口号用

  • Ext终于开始收费了

    Ext终于开始收费了

  • Visual Studio 2017安装教程

    Visual Studio 2017安装教程下载VS2017组件选择及安装设置激活其它下载VS2017下载VS2017的安装器:http://msdn.itellyou.cn/我的安装版本为:VisualStudio2017(version15.7)VisualStudioProfessional2017(version15.7)(x86andx64)-(MultipleLanguages)下载此安…

  • 数据库原理课程设计—停车场管理系统

    数据库原理课程设计—停车场管理系统数据库原理课程设计—停车场管理系统停车场收费管理系统是现代化停车场车辆收费及设备自动化管理的一个统称,是将停车场完全置于计算机统一管理下的高科技机电一体化产品。人们对停车场管理的要求越来越高,智能化程度越来越高,使用更加方便快捷。不仅提高了现代人类的工作效率,也大大的节约了人力物力,价低了公司的运营成本。它通过只能设备使感应卡记录及持卡人进出的相关信息,同时对其信息加以运算、传送并通过字符显示、语音播报等人机界面转化成人工能够辨别和判断的信号,从而实现计时收费、车辆管理等目的。针对用户的不同需求,

发表回复

您的电子邮箱地址不会被公开。

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