Thread timer in c

2019-05-23 14:12发布

问题:

can someone help me to transform my code to a working code :

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

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

/* call back function - inform the user the time has expired */
void timeout_call_back()
{
    printf("=== your time is up ===\n");
    // doing some other stuff
}

/* Go to sleep for a period of seconds */
static void* start_timer(void *args)
{
    /* function pointer */
    void (*finish_function)();


    int seconds = *((int*) args);
    pthread_mutex_lock(&mutex); // I want to do this action atomically
    printf("thread ID : %ld, go to sleep for %d\n", pthread_self(), seconds);

    finish_function = timeout_call_back;

    // ATOMIC PART
    // This function is called in real time, so I need it
    // to be safe, and it's executed just when the timer is not reached.
    atomic_function_callback();

    // THIS IS MY PROBLEM. I WANT TO WAIT for (seconds) seconds,
    // but I don't want to block other threads.
    sleep(seconds); 

    /* call the cb to inform the user time is out */
    (*finish_function)();
    pthread_mutex_unlock(&mutex);

    pthread_exit(NULL);
}

int main()
{
    pthread_t thread1, thread2, thread3;
    int seconds1 = 300;
    int seconds2 = 600;
    int seconds3 = 900;

    int rc1, rc2, rc3;

    rc1 =  pthread_create(&thread1, NULL, start_timer, (void *) &seconds1);
    if(rc1)
    printf("=== Failed to create thread1\n");
    rc2 =  pthread_create(&thread2, NULL, start_timer, (void *) &seconds2);
    if(rc2)
    printf("=== Failed to create thread2\n");

    rc3 =  pthread_create(&thread3, NULL, start_timer, (void *) &seconds3);
    if(rc3)
    printf("=== Failed to create thread3\n");

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    pthread_join(thread3, NULL);

    printf("=== End of all threads in ===\n");

    return 0;
}

When i run this code just one thread can run in a time (cause of mutex) but i need this mutex. is there any alternative to sleep() that allow me to do a non blocking timer?

This is just a sample, my real timers are very long (8 hours).

Thanks.

回答1:

Check out condition variables. https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables

What you would do is set up the condition variable and set a timed wait for your sleep. When you call the timed wait, the mutex is released for other threads. When the condition variable wakes up, you will then check to see if your timer has elapsed and notify your callback finish_function.



回答2:

Your question is a bit vague but I think you want all three threads to be sleeping at the same time, but use the mutex to make sure that none of them run the finish function at the same time?

If that's the case then you want to use the mutex only to protect the calling of finish_function, and not to protect the sleep as well. Then each thread will sleep aside one another, and as their time is up, the mutex will ensure that only one thread calls the finish_function at a time.



回答3:

Check out pthread_cond_timedwait