线程 - 同步和休眠线程拒绝唤醒(LINUX)

时间:2012-04-03 17:01:03

标签: c++ c pthreads sleep

我正在为OpenSUSE 12.1开发一个应用程序。

此应用程序有一个主线程和其他两个运行相同功能实例的线程。我正在尝试使用pthread_barrier同步所有线程,但我遇到了一些问题:

  1. 当我将派生的线程置于睡眠状态时,它们永远不会因某种原因而醒来。
  2. (在我从其他线程中删除睡眠的情况下,将CPU使用量抛向天空)在某些时候,所有线程都到达pthread_barrier_wait(),但之后没有一个继续执行。
  3. 这里有一些伪代码试图说明我在做什么。

    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);
        }
    }
    

2 个答案:

答案 0 :(得分:0)

我不认为它与屏障有关,因为你已经在伪代码中呈现了它。我假设你的glibc与我的机器大致相同。我粗略地编译了你的伪代码,并且它像我期望的那样运行:线程做了一些工作,主线程做了一些工作,它们都到达了障碍然后循环。

您是否可以对任何其他同步方法或工作函数的更多信息发表评论?

这是我正在使用的示例程序:

#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;
}

答案 1 :(得分:0)

我建议使用条件变量来同步线程。 这里有一些网站关于如何做到这一点我希望它有所帮助。

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