Trying to understand semaphore
-
but i have two thread running the how i can make it to acquire ?
-
I tried the way u told sir, Still that problem is not solved
-
Can you show me where are you creating the semaphore object ?
-
@dheerendra said in Trying to understand semaphore:
semaphore
its created seperately in a file
extern QSemaphore addSem; extern QSemaphore disSem;
But globally defined in MainWindow.cpp
-
I felt you are complicating it. Just create the QSemaphore addSem(1). You are not initialising the semaphore count. As simple stuff create the QSemaphore addSem(1) in main.cpp. Pass addSem to both the thread class.
Please note as @jsulm said, all this is not required. Since you would like to understand, we are showing you how to doit.
Another point is that - You better read how semaphores work in general. This understanding is must.
-
@dheerendra ok Sir
-
I think you are confusing semaphores with mutexes. When you have 1 resource to protect there's no need to use a semaphore.
Can you tell us where do wou declare
a
,addSem
anddisSem
?@jsulm said in Trying to understand semaphore:
you're emitting signals in a loop that means slots will be executed after the loop is finished.
Not totally correct. If the connected slot is in a thread with an active event loop it will execute "immediately".
-
Actually my aim was to check how the thread runs when we use a semaphore thats why thought of having a sample which displays each value after performing the addition but it just displays the first data after that the for loop is not running
-
This indicates that one thread has acquired & did not release the semaphore. Show us the code with your loop for both the threads.
-
@dheerendra actually i got both the values from both the thread but the value was only the first value then the next value were not updated donno whether my for loop is running?
-
@dheerendra
My thread Code:void add_thread::run() { int b = 0; int c = 0; qDebug("ADD_"); for (int a = 30; a < 40;++a) { addSem.acquire(); c = a + b; qDebug("ADD_DATA %d",c); disSem.release(); sleep(1000); b = c; addSem.available(); emit ADD_Data(c); sleep(1000); } qDebug("ADD_DATA %d",c); } My Other thread code: void display_thread::run() { int b = 0; int c = 0; for (int a = 10; a < 20; ++a) { addSem.acquire(); c = a + b; addSem.release(); b = c; addSem.available(); emit ADD_Data1(c); sleep(1000); } }
-
@ManiRon said in Trying to understand semaphore:
disSem.release();
My guess is right. Still you are releasing someother semaphore. Replace above line with addSem.release. Both the threads should work with same semaphore.
addSem.aquire() // do something addSem.release()
-
@dheerendra
Sorry sir i changed and tried but the same result. But that too the second thread data i am able to display in line edit but the first thread data i am able to print using Qdebug but couldnt see the data in line edit -
Can you show how did you declare semaphore ?
-
QSemaphore addSem;
-
- addSem is not initialised with initial semaphore count
- sleep(..) it is seconds. So to complete the loop 10 times, it takes the 10*1000 seconds. So approximately you have to wait for 3 hrs to complete this loop:). So change your sleep to sleep(1).
-
@dheerendra
done sir its working -
cool man. If you want the detailed example look at git
-
@dheerendra
Ok Sir