0

我有一个使用 futex_wait 系统调用使线程进入睡眠状态的代码。如何使用 futex_wait 系统调用使进程进入睡眠状态?

我理解这个程序,它创建线程并将它们置于睡眠状态,然后调用 futex_Wake 系统调用来唤醒线程,futex_wake 应该返回它已经唤醒的线程数

示例代码:

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

#define NUM 2

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){
    int msecs = 0;
    int waked = 0;
    while(1){
        sleep(1);
        msecs++;
        waked = syscall(SYS_futex, addr, FUTEX_WAKE, n, NULL, NULL, 0);
        if (waked == n)
            break;
        if (msecs > 100){
            printf("Wake timedout\n");
            return 0;
        }
    }
    return waked;
}

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

    /*go to sleep*/
    futex_addr = 0;
    int ret = futex_wait(&futex_addr,0);
    printf("Futex_wait_returned %d\n", ret);

    // 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*/
    int ret = futex_wake(&futex_addr, NUM);
    printf("No of futex_wake processes are %d\n", ret);

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

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

我对它很陌生,所以我想了解我应该进行哪些更改才能使用 futex 使进程进入睡眠状态

4

0 回答 0