Domanda

I have a process which contain two threads. I want to schedule them based on their priority(SCHED_RR policy). Let t1, t2 denote these threads, both having priority 1 (lowest) initially.

I want to make sure that my thread t1 is not preempted/rescheduled while it is doing critical task - so I boost its priority to maximum before the critical task and reduce it to the original value after the critical task:

thread_proc_t1() {
    while(1) {
        if(critical condition happens) {
            set_priority_max();
        }
        printf("t1");
        usleep(xxx);
        if(critical task finished ) {
            reset_priority();
        }
    }   
}

thread_proc_t2() {
    while(1) {
        printf("t2");
        usleep(xxx);
    }   
}

I expect the printf() commands in thread t2 not to be executed after I've called set_priority_max() in thread t1. But the output does contains prints from thread t2 also.

  1. Why is this the case?

  2. How can I solve this problem?

È stato utile?

Soluzione

There's no problem, this is expected behavior.

First, if you have more than one core, then the priorities won't matter if there are fewer ready-to-run threads than cores -- each thread will get its own core.

Second, your high-priority thread sleeps, which gives the lower-priority thread time to run.

Third, your threads interact through the lock that protects standard output. The higher-priority thread can be waiting for that lock, allowing lower-priority threads to run.

Please don't try to use priorities this way. It adds massive complexity, hurts performance, and rarely accomplishes anything useful.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top