MUTEX _TIME BASED LOCK UNLOCK SYSTEM to avoid priority inversion and deadlock or thread stuck issue.

Committer:
radhey04ec
Date:
Sun Jul 26 13:15:49 2020 +0000
Revision:
0:f8e6d9529dbd
Child:
1:4f150e2895bf
MUTEX_TIME BASED LOCK SYSTEM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
radhey04ec 0:f8e6d9529dbd 1 // MUTEX : PART 2 -MUTEX TIME BASED LOCKING
radhey04ec 0:f8e6d9529dbd 2
radhey04ec 0:f8e6d9529dbd 3 /*As we know MUTEX have ownership in locking mechanism. Thread which locked code using mutex flag then only same thread can unblock it
radhey04ec 0:f8e6d9529dbd 4 If you have not enough knowledge regarding RTOS then it leads some dangerous situation like priority inversion and Deadlock
radhey04ec 0:f8e6d9529dbd 5
radhey04ec 0:f8e6d9529dbd 6 Time based unlocking help us to avoid DEADLOCK.
radhey04ec 0:f8e6d9529dbd 7 Here mutex automatically unlock the block after ending time period
radhey04ec 0:f8e6d9529dbd 8
radhey04ec 0:f8e6d9529dbd 9 Program created by : Jaydeep shah -radhey04ec@gmail.com
radhey04ec 0:f8e6d9529dbd 10 Date : 26 July 2020
radhey04ec 0:f8e6d9529dbd 11 */
radhey04ec 0:f8e6d9529dbd 12
radhey04ec 0:f8e6d9529dbd 13
radhey04ec 0:f8e6d9529dbd 14 /* Function use
radhey04ec 0:f8e6d9529dbd 15 bool trylock_for(Kernel::Clock::duration_u32 rel_time);
radhey04ec 0:f8e6d9529dbd 16 Tries to lock the mutex. If it succeeds within the specified time frame (interval) the mutex is locked and stays locked until unlocked by calling the unlock function.
radhey04ec 0:f8e6d9529dbd 17
radhey04ec 0:f8e6d9529dbd 18 bool trylock_until(Kernel::Clock::time_point abs_time);
radhey04ec 0:f8e6d9529dbd 19 Tries to lock the mutex. If it succeeds before the given time point is reached it locks the mutex and the mutex stays locked until unlocked by calling the unlock function.
radhey04ec 0:f8e6d9529dbd 20
radhey04ec 0:f8e6d9529dbd 21 */
radhey04ec 0:f8e6d9529dbd 22
radhey04ec 0:f8e6d9529dbd 23 #include "mbed.h"
radhey04ec 0:f8e6d9529dbd 24
radhey04ec 0:f8e6d9529dbd 25 Mutex Lock;
radhey04ec 0:f8e6d9529dbd 26 Thread T1,T2;
radhey04ec 0:f8e6d9529dbd 27 bool V;
radhey04ec 0:f8e6d9529dbd 28 void common_block(const char* name, int state)
radhey04ec 0:f8e6d9529dbd 29 {
radhey04ec 0:f8e6d9529dbd 30 printf("\n Thread arrive %s %d \n", name, state);
radhey04ec 0:f8e6d9529dbd 31 if (Lock.trylock_for(50)) { // try to lock the mutex: timeout = 100 ms
radhey04ec 0:f8e6d9529dbd 32 printf("\n Inside %s state %d \n", name, state);
radhey04ec 0:f8e6d9529dbd 33 ThisThread::sleep_for(6000); //some how process stuck in wait state
radhey04ec 0:f8e6d9529dbd 34 printf("\n outside %s state %d \n", name, state);
radhey04ec 0:f8e6d9529dbd 35 Lock.unlock(); // unlock
radhey04ec 0:f8e6d9529dbd 36 }
radhey04ec 0:f8e6d9529dbd 37 else
radhey04ec 0:f8e6d9529dbd 38 {
radhey04ec 0:f8e6d9529dbd 39
radhey04ec 0:f8e6d9529dbd 40 printf("\n %s thread fail to lock state %d",name,state);
radhey04ec 0:f8e6d9529dbd 41 }
radhey04ec 0:f8e6d9529dbd 42 }
radhey04ec 0:f8e6d9529dbd 43 void fun(void const *arg)
radhey04ec 0:f8e6d9529dbd 44 {
radhey04ec 0:f8e6d9529dbd 45 while(true)
radhey04ec 0:f8e6d9529dbd 46 {
radhey04ec 0:f8e6d9529dbd 47 common_block((const char *)arg,0); //PASS STATE 0
radhey04ec 0:f8e6d9529dbd 48 wait(2);
radhey04ec 0:f8e6d9529dbd 49 common_block((const char *)arg,1);// PASS STATE 1
radhey04ec 0:f8e6d9529dbd 50 wait(2);
radhey04ec 0:f8e6d9529dbd 51 }
radhey04ec 0:f8e6d9529dbd 52 }
radhey04ec 0:f8e6d9529dbd 53
radhey04ec 0:f8e6d9529dbd 54 int main()
radhey04ec 0:f8e6d9529dbd 55 {
radhey04ec 0:f8e6d9529dbd 56 T1.start(callback(fun,(void *)"T1"));
radhey04ec 0:f8e6d9529dbd 57 T2.start(callback(fun,(void *)"T2"));
radhey04ec 0:f8e6d9529dbd 58 fun((void *)"main");
radhey04ec 0:f8e6d9529dbd 59 }
radhey04ec 0:f8e6d9529dbd 60