[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 310
  • Last Modified:

Critical Sections

I'm writting a C program which is supposed to run on multiple platforms (Windows, AIX ,..),This program is multithreaded, There are sections in the program that i want to restrict only one thread at a time to execute those sections(Critical Sections), I know that the solution is to use MUTEX.
Anyone can tell me wether the language C supports MUTEX or Not???
if yes , Tell me the details.
or if anyone has a different solution, pls tell me.
I want to confirm that i can't use a platform dependent solution.
0
fattien
Asked:
fattien
1 Solution
 
BlackDiamondCommented:
Yes, you can use mutexes in C.  It is dependant on the thread library that you are using as to how you implement them.  What thread library are you using?

If you are using pthread, then the function you are looking for pthread_mutex_lock.
0
 
thienpnguyenCommented:
C/C++ doesn't support "synchronization" stuff as Critical Sections, Mutex .... . You need to use a platform dependent solution for "multi thread" .
0
 
makerpCommented:
WINDOZZZZZZZE

/* either have this global, a class member or pass it to the function(s) that will use it */
HANDLE mutex = CreateMutex(NULL,FALSE,NULL)

void my_fn()
{
  if(WaitForSingleObject(mutex,my_timeout_in_millis /* use the INFINITE constant to wait for ever */) == WAIT_OBJECT_0)
  {
    // do your stuff here
    ReleaseMutex(mutex);
  }
  else
  {
    // your request for the mutex timed out
  }
}

it will be very similar on other platforms. if the mutex only need local process scope then use CRITICAL_SECTION instead as they are more light weight. these have the same semantics and are similar to use..........

0
 
arul_mCommented:
It is possible to implement Mutex independent of platform by locking an OS resource with platform independent C Runtime API. I have implemented mutex by locking/unlocking the file. Find below the code skeleton for the same:

Mutex Locking:
^^^^^^^^^^^^^^
while(true)
{
 /* Try to remove the 'locked' file.
    This will throw an error if a
    thread/process has already opened
    the file */

  if (remove(filename)==0)
    break;

  // Wait for a while before trying again
  sleep(delay);
}
file = fopen(filename,"w");


Unlocking the mutex:
^^^^^^^^^^^^^^^^^^^
fclose(file);
file = NULL;

In the above example, you need to share the 'filename' across threads.
0
 
SpideyModCommented:
All,
I am unlocking this question in preparation for cleanup.  I will return in 7 days to finalize this question.  Please leave any recommendations for the final state of this question, I will take all recommendations into consideration.  Failing any feedback, I may decide in 7 days to delete or PAQ this question with no refund.  Thanks.

SpideyMod
Community Support Moderator @Experts Exchange
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now