using mutexes

I

iceman

Hi All,

Suppose that my program is such that


int counter;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
void *functionC()
{
pthread_mutex_lock( &mutex1 );
counter++;
printf("Counter value: %d\n",counter);
pthread_mutex_unlock( &mutex1 );
}

int main()
{
pthread_t thread_id;
pthread_create (&thread_id, NULL, &functionC, NULL);
//increment counter in main also

}


Will there be a problem when I do this?If the thread is schduled first
will the main() wait untill the thread unlocks?
If not,Is there anyway to lock the variable in the main program as
well as in the thread.

Cheers
 
M

Martin York

Will there be a problem when I do this?

No problems.



If the thread is schduled first
will the main() wait untill the thread unlocks?

No. To make the main thread wait you must make it try and take the
lock.

If not,Is there anyway to lock the variable in the main program as
well as in the thread.

Yes:
// Init counter.
int counter = 0;


// I hope this is some strange way of calling
// pthread_mutex_init()
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;


void *functionC(void*)
{
inc_counter();
}

void inc_counter()
{
pthread_mutex_lock( &mutex1 );
counter++;
printf("Counter value: %d\n",counter);
pthread_mutex_unlock( &mutex1 );

}

int main()
{
pthread_t thread_id;
pthread_create (&thread_id, NULL, &functionC, NULL);

//increment counter in main also
inc_counter();
}
 
I

Ian Collins

iceman said:
Hi All,

Suppose that my program is such that


int counter;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

May I suggest you ask on comp.programming.threads?

pthreads are topical there, but not here.
 
S

Szabolcs Ferenczi

iceman said:
Will there be a problem when I do this?If the thread is schduled first
will the main() wait untill the thread unlocks?

The main thread will not wait but you can arrange that it does. If you
insert a pthread join operation, your main thread will wait until the
forked thread finishes.

int main()
{
pthread_t thread_id;
pthread_create (&thread_id, NULL, &functionC, NULL);
//increment counter in main also
pthread_join(thread_id, NULL);
}

Best Regards,
Szabolcs
 
J

James Kanze

Suppose that my program is such that
int counter;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
void *functionC()
{
pthread_mutex_lock( &mutex1 );
counter++;
printf("Counter value: %d\n",counter);
pthread_mutex_unlock( &mutex1 );
}
int main()
{
pthread_t thread_id;
pthread_create (&thread_id, NULL, &functionC, NULL);
//increment counter in main also
}

That looks more like Posix C than anything C++. You really
should ask in a Posix (Unix) group, rather than here.
Will there be a problem when I do this?

Not if you synchronize the access to counter in main as well.
The Posix rule (which, I believe, will be the C++ rule when C++
adds threading in the next version) is simple: if any thread
modifies an object, and more than one thread accesses the
object, then all accesses must be externally synchronized.
If the thread is schduled first
will the main() wait untill the thread unlocks?

Why should it?
If not,Is there anyway to lock the variable in the main
program as well as in the thread.

The same way you locked it in the thread.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,013
Latest member
KatriceSwa

Latest Threads

Top