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

问题描述:

我在为OpenSUSE 12.1开发应用程序。线程 - 同步和睡眠线程拒绝唤醒(LINUX)

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

  1. 当我把衍生线程睡觉,他们将永远不会醒来出于某种原因。
  2. (在我从其他线程中删除睡眠时,将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); 
    } 
} 
+3

创建一个可以编译一个小例子,或张贴真正相关的代码。伪代码可能没有真实代码所具有的错误/错误。 – nos 2012-04-03 17:05:51

+0

您是否正确设置了t1变量? – 2012-04-03 17:28:45

+0

是的,它设置正确。 – 2012-04-03 17:42:18

我不认为它与屏障有关,因为您已经在伪代码中呈现它。我假设你的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; 
} 
+0

好吧。我只使用一个互斥锁来确保我保护了一些数据,但是如果我删除它,这种行为不会改变。这项工作真的很大。涉及SHM,一些音频处理,一些音频验证,但就我可以调试它而言,所有这些都没有关系。我所观察到的是线程陷入了睡眠,除了主线之外。即使我删除了障碍,主线程仍会继续运行,而其他两个线程永远不会醒来。 – 2012-04-03 19:40:01

+0

非常感谢您的帮助。 – 2012-04-03 19:41:08

+0

也许我可以给你发送一些源文件,但也许这会让事情更加混乱。 – 2012-04-03 19:59:12

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

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