简体   繁体   中英

Thread - synchronizing and sleeping thread refuses to wake up (LINUX)

I'm developing an application For OpenSUSE 12.1.

This application has a main thread and other two threads running instances of the same functions. I'm trying to use pthread_barrier to synchronize all threads but I'm having some problems:

  1. When I put the derived threads to sleep, they will never wake up for some reason.
  2. (in the case when I remove the sleep from the other threads, throwing CPU usage to the sky) In some point all the threads reach pthread_barrier_wait() but none of them continues execution after that.

Here's some pseudo code trying to illustrate what I'm doing.

pthread_barrier_t barrier;
int main(void)
{
    pthread_barrier_init(&barrier, NULL , 3);
    pthread_create(&thread_id1, NULL,&thread_func, (void*) &params1);
    pthread_create(&thread_id2v, NULL,&thread_func, (void*) &params2);

    while(1)
    {
        doSomeWork();
        nanosleep(&t1, &t2);

        pthread_barrier_wait(&barrier);

        doSomeMoreWork();
   }
}

void *thread_func(void *params)
{
    init_thread(params);

    while(1)
    {
        nanosleep(&t1, &t2);
        doAnotherWork();

        pthread_barrier_wait(&barrier);
    }
}

I would suggest to use condition variables in order to synchronize threads. Here some website about how to do it i hope it helps.

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

I don't think it has to do with the barrier as you've presented it in the pseudocode. I'm making an assumption that your glibc is approximately the same as my machine. I compiled roughly your pseudo-code and it's running like I expect: the threads do some work, the main thread does some work, they all reach the barrier and then loop.

Can you comment more about any other synchronization methods or what the work functions are?

This is the the example program I'm using:

#include <pthread.h>
#include <stdio.h>
#include <time.h>

struct timespec req = {1,0}; //{.tv_sec = 1, .tv_nsec = 0};
struct timespec rem = {0,0}; //{.tv_sec = 0, .tv_nsec = 0};

pthread_barrier_t barrier;

void *thread_func(void *params) {
   long int name;
   name = (long int)params;
   while(1) {
      printf("This is thread %ld\n", name);
      nanosleep(&req, &rem);

      pthread_barrier_wait(&barrier);

      printf("More work from %ld\n", name);
   }
}

int main(void)
{
   pthread_t th1, th2;

   pthread_barrier_init(&barrier, NULL , 3);
   pthread_create(&th1, NULL, &thread_func, (void*)1);
   pthread_create(&th2, NULL, &thread_func, (void*)2);

   while(1) {
      nanosleep(&req, &rem);
      printf("This is the parent\n\n");

      pthread_barrier_wait(&barrier);
   }
   return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM