我试图制定一个计划,以时间限制功能的执行。在下面我的代码有一个名为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_cancel之前采取锁,并在您的“安全区”持有相同的锁。

不幸的是,你不能等待一个互斥体或信号处理程序信号量。但报警信号不是10秒后做一些事情的唯一办法 - 你可以代替有你的主线程进入睡眠状态10秒,再醒来,采取锁,取消工作线程,然后加入吧

当然,这将意味着主线程将休眠10秒即使工作线程结束后5秒。因此,不是睡觉的,有主线程做10秒的定时等待一个信号量,该工作线程的职位当它完成。

像睡眠,一个定时的等待可以早期由于信号完成的,所以一定要重试上EINTR定时的等待。你显著案件EINTR(再次等待),成功(参加工作线程 - 没有必要取消,因为它已经发布了信号),ETIMEDOUT(取锁,取消,加入),如果你喜欢,其他的错误。有迹象表明,应该影响你sem_timedwait没有列出任何其他错误,但。

另一个想法是阻止SIGALRM在您的“安全区”,这将是除(一)简单的我永远记得怎么做安全I /带信号O不允许,和(b)你的工作线程很可能是运行“同时”与信号处理(无论是真正的同时或显然让因抢占),这意味着信号可以采取,那么你的工人禁用信号,进入临界区,那么信号处理函数取消它。如果谁能够真正记住的细节无人接听,这里的一些的上阻塞信号的信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top