-1

Putting it simple, I need two task, with one task having high priority, and other is low. when high priority. task is in execution low priority task should stop and after completion of high priority task , low priority task should Resume from previous state. So need help.. This is example i used.

`#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *print_message_function( void *ptr );
main()
{

     pthread_t thread1, thread2;
     const char *message1 = "Thread 1";
     const char *message2 = "Thread 2";
     int  th1, th2;
    /* Create independent threads each of which will execute function */
    while (1)
    {
 th1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
     if(th1)
     {
         fprintf(stderr,"Error - pthread_create() return code: %d\n",th1);
         exit(EXIT_FAILURE);
    }
 th2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);

 if(th2)
     {
         fprintf(stderr,"Error - pthread_create() return code: %d\n",th2);
         exit(EXIT_FAILURE);
     }
     printf("pthread_create() for thread 1 returns: %d\n",th1);
     printf("pthread_create() for thread 2 returns: %d\n",th2);

 }   
    /* Wait till threads are complete before main continues. Unless we  */
    /* wait we run the risk of executing an exit which will terminate   */
    /* the process and all threads before the threads have completed.   */

     pthread_join( thread1, NULL);
     pthread_join( thread2, NULL);
     exit(EXIT_SUCCESS);
}
void *print_message_function( void *ptr )
{
     char *message;
     message = (char *) ptr;
     printf("%s \n", message);
}

`

Ax Cool
  • 115
  • 1
  • 6
  • 1
    Show your efforts – LPs Oct 04 '16 at 10:28
  • 2
    A thread that is waited for by another thread is not very multy-threading. – tofro Oct 04 '16 at 12:09
  • @tofro: ok. Than not multi-threading , but how do i achieve my goal.? – Ax Cool Oct 04 '16 at 12:22
  • 1
    What you describe sounds more like real time tasks where high priority tasks always preempt lower priority ones. May be you could have a look to [RTLinux](https://en.wikipedia.org/wiki/RTLinux)... – Serge Ballesta Oct 05 '16 at 08:19
  • Some similar question on the subject: http://stackoverflow.com/q/1606400/1212012, http://stackoverflow.com/q/9397068/1212012, http://stackoverflow.com/q/11046720/1212012. The difficulty is pausing the low priority thread, resuming it is quite simple. – Mathieu Oct 05 '16 at 08:36
  • @SergeBallesta :- Yes It's real time linux only. – Ax Cool Oct 05 '16 at 08:49
  • @purplepsycho : thnks for the references. It may be difficult. But How do I do it? – Ax Cool Oct 05 '16 at 08:51
  • @SergeBallesta :- Yes It's real time linux only. I have went through the link provided. Actually two threads are created and working on above pasted code. Now I wanted to make low prio. task to sleep while high prio task runs than low prio. should resume. – Ax Cool Oct 05 '16 at 09:01

1 Answers1

0

If you have a RTLinux (linux with real time extensions), you could simply define the priorities of the threads and let the system automatically suspend a low priority thread as soon as a higher priority thread starts. The referenced page show how to create a thread with a given priority (the lowest the highest):

pthread_attr_t attr;
struct sched_param param;
pthread_attr_init(&attr);
param.sched_priority = 1;    // here priority will be 1
pthread_attr_setschedparam(&attr, &param);
pthread_create(&t1, &attr, &print_message_function, (void*) message1);

But you should not repeatedly start new threads in a loop, but put the loop in the function. To reproduce the example, print_message_function could be:

void print_message_function(void *ptr) {
    char * message = ptr;
    int i;
    for (i=1; i<10; i++) {
        printf("%s\n", message);
    }
}

(here it will print 10 messages per thread)

Serge Ballesta
  • 143,923
  • 11
  • 122
  • 252