c++ - 线程 - 同步和 sleep 线程拒绝唤醒(LINUX)

标签 c++ c pthreads sleep

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

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

  1. 当我将派生线程置于休眠状态时,它们将永远不会出于某种原因醒来。
  2. (如果我从其他线程中删除 sleep ,将 CPU 使用率抛向天空)在某些时候所有线程都到达 pthread_barrier_wait() 但之后没有一个线程继续执行。

这里有一些伪代码试图说明我在做什么。

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

最佳答案

我认为这与您在伪代码中介绍的障碍无关。我假设您的 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;
}

关于c++ - 线程 - 同步和 sleep 线程拒绝唤醒(LINUX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9997942/

相关文章:

c++ - #define 以及如何使用它们 - C++

c++ - 通过函数指针优化和内联调用

C: fprintf 不工作

c - 从线程返回单个整数值

c++ - popen 管道会减慢其他线程的速度

c++ - 为什么我的代码无法识别空行 C++

c++ - 我的小程序中有某种断言错误

c++ - 为什么这个 OpenGL 旋转也会平移我的对象?

c - C中putc()的宏实现

multithreading - pthread_join 因 OSX 上的段错误而间歇性崩溃