Solved

Use of Semaphore

Posted on 1999-01-13
5
343 Views
Last Modified: 2010-04-15
How does the CreateSemaphore(), ReleaseSemaphore() and WaitForSingleObject() works? And what are the pararmeters and conditions that are to be put in to implement Semaphore?
0
Comment
Question by:ho_cm
5 Comments
 

Author Comment

by:ho_cm
ID: 1255828
I am new in this area.. So please explain in simpler terms! Thanx!
0
 

Expert Comment

by:pinki
ID: 1255829
I din't get clearly what do you want especially pertaining to the

functions .Are you using the function names in general sense ? or

with respect to any specific functions as such ( I don't think so as such functions you have named exist or not in terms of system calls ! )

If you want know how to use a semaphore -- I mean starting from creation , release and syncronisation w.r.t given resources,then
I can explain you.Please let me know.
0
 
LVL 1

Accepted Solution

by:
940961sl earned 10 total points
ID: 1255830
Those functions are usefull when you want to work with threads. A thread is a copy of a function that runs simultaniously with other treads of that function.
To say it in normal words  : your function works more than once at the same time.
Now lets say your function needs some variables from your main program. how does the main program tell which tread needs the variables, and how do the threads know that the variables are (not) for them??
thanks to semaphores :
1. All the treads have the same parameterlist.
2. Every thread has a unique semaphore, made with createsemaphore.

When the tread has nothing to do, it uses SetEvent to tell the main program. And it waits for a respons from the program using WaitForSingleObject.

3. The main program uses ReleaseSemaphore to tell the tread that the variables in the parameterlist are for him.

Check out the program I once have written to learn working with threads.
the main program starts 100 threads of the function "threadfunctie"
After that, the main program sends random numbers to random treads.

the treads receive the numbers and use them (sleep(number)), after that, they wait for a new number.

#include <memory.h>
#include <malloc.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/timeb.h>
#include <time.h>

const int maxthread = 99;
const int maxdelay = 20000;

typedef void *HANDLE;

typedef long              *An_Item_Ptr;
typedef An_Item_Ptr       An_Item_List[];

typedef struct
{
    int            Number;
    An_Item_List  *Items;
} An_Array;

typedef struct
{
      HANDLE                  threadhandle;
      HANDLE                  semaphorehandle;
      int                        number;
      int                        Info;
      int                        bussy;
} A_Thread;

typedef A_Thread            * A_Thread_Ptr;

typedef struct
{
      int            *number;
      int            *info;
      int            *bussy;
      HANDLE      *semaphorehandle;
} A_Parameter_List;

char *GetTime()
{
      char static ActualTime[12];
      struct _timeb timebuffer;
      div_t result;
      int hun;

      _strtime(&ActualTime[0]);
      ActualTime[8] = '.';
      _ftime(&timebuffer);
      result = div(timebuffer.millitm, 10);
      (result.rem > 4 && result.quot < 99 ? hun = result.quot + 1 : hun = result.quot);
      _itoa(hun, &ActualTime[9], 10);
      if (hun < 10) ActualTime[10] = ' ';
      ActualTime[11] = '\0';
      return ActualTime;
}

void Append_Item ( An_Array * Array)
{
   An_Item_List    *Item_List;
   int              Current_Index = -1;
   int              Counter;

   if (Array->Number == 0)
   {
      Array->Number = 1;
      Current_Index = Array->Number - 1;
      Item_List = (An_Item_List *) malloc (Array->Number * sizeof(An_Item_Ptr));
      Array->Items = Item_List;
   }
   else
   {
      An_Item_List  *Old_Item_List;
      Item_List = Array->Items;
      Old_Item_List = Item_List;
      Current_Index = Array->Number;
      Array->Number++;
      Item_List = (An_Item_List *) malloc (Array->Number * sizeof(An_Item_Ptr));
      for (Counter = 0; Counter < Array->Number - 1; Counter ++)
        {
         (*Item_List)[Counter] = (*Old_Item_List)[Counter];
      }
      free   (Old_Item_List);
      Array->Items = Item_List;
   }
}

An_Array            threads;
int                        Job_Finished = 0;

void * threadfunctie(A_Parameter_List * Parameter_List)
{
      int            *info = Parameter_List->info;
      int            number = *(Parameter_List->number);  //number is altijd zelfde
      int            *bussy = Parameter_List->bussy;
      HANDLE      *semaphorehandle = Parameter_List->semaphorehandle;
      printf("%s Thread %2d : started\n", GetTime(), number);
      *semaphorehandle = CreateSemaphore ( NULL,0,100,NULL);
      for(;!Job_Finished;)
      {
            SetEvent(*semaphorehandle);
            WaitForSingleObject(*semaphorehandle, 300000);
            Sleep(*info);
            printf("%s Thread %2d : number %d received\n", GetTime(), number, *info);
            *bussy = 0;
      }
      return(0);
}

void main (void)
{
      
      DWORD            Id;
      A_Thread_Ptr      thread;
      A_Parameter_List                  * Parameter_List;
      int r, threadnr, info;
      div_t result;

      printf("%s Program   : started\n", GetTime());
      for (int i = 0; i < maxthread; i++)
      {
            Append_Item(&threads);
            thread = (A_Thread *) malloc (sizeof(A_Thread));
            memset (thread, 0, sizeof (A_Thread));
            (*threads.Items)[i] = (An_Item_Ptr) thread;
            thread->number = i;

            Parameter_List = (A_Parameter_List *)malloc (sizeof(A_Parameter_List));
            Parameter_List->number = &(thread->number);
            Parameter_List->semaphorehandle = &(thread->semaphorehandle);
            Parameter_List->info = &(thread->Info);
            Parameter_List->bussy=&(thread->bussy);
            thread->threadhandle=CreateThread (NULL, 32000, (LPTHREAD_START_ROUTINE) &threadfunctie, (LPVOID) Parameter_List, 0, &Id);
            
      }

      Sleep(1000);

      for(;!Job_Finished;)
      {
            r = rand();
            result = div(r, maxdelay);
            info = result.rem;
            result = div(r, maxthread);
            threadnr = result.rem;

            if (((A_Thread_Ptr) (*threads.Items)[threadnr])->bussy == 0)
            {
                  ((A_Thread_Ptr) (*threads.Items)[threadnr])->Info = info;
                  ((A_Thread_Ptr) (*threads.Items)[threadnr])->bussy = 1;
                  ReleaseSemaphore    (((A_Thread_Ptr) (*threads.Items)[threadnr])->semaphorehandle, 1, NULL );
                  printf("%s Program   : send number %d to thread %d\n", GetTime(), info, threadnr);
            }
            else
            {
                  printf("%s Program   : thread number %2d is bussy\n", GetTime(), threadnr);
            }

            Sleep(1000);
      }
}


hope this helps

Stefaan
0
 

Author Comment

by:ho_cm
ID: 1255831
If you want know how to use a semaphore -- I mean starting from creation , release and syncronisation w.r.t given resources,then
I can explain you.Please let me know...

Yup! Please explain to me in further details ..! thanx!

My application the use of Shared Memory.. to exchange data between applications.. and my client application is ran based on 6 phone lines ..sort of voice automated applications simultaneously... i.e calling the function to send message data... at unpredictable time... So how can it be implemented using semaphore.. thanx!
0
 
LVL 11

Expert Comment

by:alexo
ID: 1255832
Using SetEvent() on a semaphore handle?  Wow...
0

Featured Post

Do email signature updates give you a headache?

Are you constantly making changes to email signatures? Are the images not formatting how you want them to? Want high-quality HTML signatures on all devices, including on mobiles and Macs? Then, let Exclaimer solve all your email signature problems today.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
how to connect an iphone application to mysql database 10 189
libcurl and C++ - Post JSON Data 8 1,199
Test against App 49 133
How to translate this 2-line while loop into C from Perl? 8 76
Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
This tutorial is posted by Aaron Wojnowski, administrator at SDKExpert.net.  To view more iPhone tutorials, visit www.sdkexpert.net. This is a very simple tutorial on finding the user's current location easily. In this tutorial, you will learn ho…
The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.

864 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now