前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >futex的使用_fuel开关

futex的使用_fuel开关

作者头像
全栈程序员站长
发布2022-11-08 13:36:46
6710
发布2022-11-08 13:36: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.cn/191141.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月21日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档