Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何对具有安全区域的函数设置时间限制_C_Signals_Preemption - Fatal编程技术网

C 如何对具有安全区域的函数设置时间限制

C 如何对具有安全区域的函数设置时间限制,c,signals,preemption,C,Signals,Preemption,我正试图开发一个程序来限制函数的执行时间。在下面的代码中,我有一个名为Inc的函数,它执行大量迭代(由无限循环模拟)。每次迭代的第一部分相当长,第二部分应该相当快 我不介意在代码的第一部分中抢先执行,但我希望避免在第二部分中执行写操作时发出警报 我的第一个想法是在进入“安全区域”前关闭警报,以节省剩余的时间。然后退出后,我会用节省的时间设置闹钟。我不知道如何实现这一点。有人能帮我吗?也欢迎其他方法 #include <pthread.h> #include <signal.h&

我正试图开发一个程序来限制函数的执行时间。在下面的代码中,我有一个名为
Inc
的函数,它执行大量迭代(由无限循环模拟)。每次迭代的第一部分相当长,第二部分应该相当快

我不介意在代码的第一部分中抢先执行,但我希望避免在第二部分中执行写操作时发出警报

我的第一个想法是在进入“安全区域”前关闭警报,以节省剩余的时间。然后退出后,我会用节省的时间设置闹钟。我不知道如何实现这一点。有人能帮我吗?也欢迎其他方法

#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

pthread_t thread;
FILE *fout;

void *Inc(void *param){

    int i;
    long long int x = 0;

    fout = fopen("file.txt", "w");

    /* Large number of iterations */
    while(1){

        int k = 0;
        for(i=0; i<5000000; i++)
            k += (rand())%3;
        x += k;

        printf("%lld\n", x);
        /* Enter Safe Region */
        fprintf(fout, "%lld\n", x);
        /* Exit Safe Region */
    }   
}

void Finish(int param){
    pthread_cancel(thread);
    fclose(fout);
}

main (){

    pthread_attr_t attr;
    void *status;

    signal(SIGALRM, Finish);
    alarm(10);

    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    pthread_create(&thread, &attr, Inc, NULL);
    pthread_attr_destroy(&attr);
    pthread_join(thread, &status);

    printf("Program Finished\n");
}
#包括
#包括
#包括
#包括
#包括
pthread\u t线程;
文件*fout;
void*Inc(void*param){
int i;
长整型x=0;
fout=fopen(“file.txt”,“w”);
/*大量迭代*/
而(1){
int k=0;

对于(i=0;i来说,最明显的事情是在调用
pthread\u cancel
之前获取一个锁,并在“安全区域”中保持相同的锁

不幸的是,你不能在信号处理程序中等待互斥或信号量。但是警报信号并不是在10秒后做某事的唯一方法——你可以让你的主线程休眠10秒,然后醒来,锁定,取消工作线程,然后加入它

当然,这意味着即使工作线程在5秒后完成,主线程也会休眠10秒。因此,与其休眠,不如让主线程对信号量进行10秒的定时等待,工作线程在完成后会发布信号量

与睡眠一样,定时等待可能由于信号而提前完成,因此请确保在EINTR上重试定时等待。您的重要案例包括EINTR(再次等待)、成功(加入工作线程-无需取消,因为它已发布信号量)、ETIMEDOUT(锁定、取消、加入)如果您愿意,还有其他错误。
sem\u timedwait
中没有列出会影响您的其他错误


另一个想法是在您的“安全区域”中阻止SIGALRM,这将更简单,除了(a)我永远记不起如何在禁用信号的情况下安全地执行I/O,以及(b)您的工作线程可能与信号处理程序“同时”运行(可能是真正同步的,或者由于抢占而明显是同步的),这意味着可以接收信号,然后您的工作人员禁用信号并进入关键区域,然后信号处理程序将其取消。如果没有人回答,谁能真正记住细节,这里有一些。

抱歉,我几乎无法理解您所说的内容。我对操作系统知之甚少。使用定时等待eems是一个很好的方法,但是你能提供一些参考吗?谢谢!不容易。如果你不了解锁、信号量和互斥量是什么,那么就从介绍使用pthreads和信号量(例如)编程开始。一旦你了解了基础知识,我认为我写的应该是有意义的。