gpt4 book ai didi

c - futex 在这种情况下如何工作?

转载 作者:太空宇宙 更新时间:2023-11-04 08:39:23 24 4
gpt4 key购买 nike

我有一个futex的示例代码。但是我无法理解代码流程....

#include <stdio.h>
#include <pthread.h>
#include <linux/futex.h>
#include <syscall.h>
#include <unistd.h>

#define NUM 50

int futex_addr;

int futex_wait(void* addr, int val1){
return syscall(SYS_futex,&futex_addr,val1, NULL, NULL, 0);
}
int futex_wake(void* addr, int n){
return syscall(SYS_futex, addr, FUTEX_WAKE, n, NULL, NULL, 0);
}

void* thread_f(void* par){
int id = (int) par;

/*go to sleep*/
futex_addr = 0;
futex_wait(&futex_addr,0);

printf("Thread %d starting to work!\n",id);
return NULL;
}

int main(){
pthread_t threads[NUM];
int i;

for (i=0;i<NUM;i++){
pthread_create(&threads[i],NULL,thread_f,(void *)i);
}

printf("Everyone wait...\n");
sleep(1);
printf("Now go!\n");
/*wake threads*/
futex_wake(&futex_addr,50);

/*give the threads time to complete their tasks*/
sleep(1);


printf("Main is quitting...\n");
return 0;
}

输出是这样的:

Everyone wait...
Now go!
Thread 0 starting to work!
Thread 1 starting to work!
Thread 2 starting to work!
Thread 3 starting to work!
Thread 4 starting to work!
Thread 5 starting to work!
Thread 6 starting to work!
Thread 7 starting to work
Thread 8 starting to work!
Thread 9 starting to work!
.
.
Main is quitting

这段代码实际表现如何??

thread_f 函数的触发器是什么??

wait & wake 在这里是如何工作的??

最佳答案

  1. 您创建了 50 个线程并将主线程置于休眠状态。
  2. 在每个线程中,将 futex_addr 的值设置为零(冗余)。
  3. 您调用 futex_wait 并使用该值的地址和零值参数。这意味着“阻止,如果我指向的值(仍然)真的是零”
  4. sys_futex 检查 &futex_addr 的值是否真的为零,这是阻塞线程的条件(这对于系统调用的正确操作很重要,否则 futex_wake 必须像 Windows 下的 NtReleaseKeyedEvent 一样阻塞)。当然,该值为零,这是任何线程曾经写入的所有内容,因此您的线程会阻塞。
  5. 主线程最终从sleep返回并调用参数为50的futex_wake,这意味着“唤醒(最多)50个正在等待的线程&futex_addr。因此,您所有的 50 个线程都在一个巨大的群中醒来。
  6. 每个线程将一条消息写入 stdout(没有同步,因此您可能会看到乱码输出)并退出。
  7. 主线程也退出了,没有加入线程或同步,但是由于第二次调用 sleep,它很可能会“正常工作”而不会发生坏事,无论如何(不是那个写这样的代码是件好事!)。

请注意,这种唤醒 N 线程的方法有效,但不鼓励使用(很像一开始就使用 futex 也是不鼓励的) ).通常,您只想唤醒一个线程(使用 1)或所有线程(使用 INT_MAX)。

关于c - futex 在这种情况下如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24488564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com