线程 - 同步和睡眠线程拒绝唤醒(LINUX)
我在为OpenSUSE 12.1开发应用程序。线程 - 同步和睡眠线程拒绝唤醒(LINUX)
此应用程序有一个主线程和其他两个线程运行相同功能的实例。我试图用pthread_barrier
同步所有的线程,但我有一些问题:
- 当我把衍生线程睡觉,他们将永远不会醒来出于某种原因。
- (在我从其他线程中删除睡眠时,将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*) ¶ms1);
pthread_create(&thread_id2v, NULL,&thread_func, (void*) ¶ms2);
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;
}
好吧。我只使用一个互斥锁来确保我保护了一些数据,但是如果我删除它,这种行为不会改变。这项工作真的很大。涉及SHM,一些音频处理,一些音频验证,但就我可以调试它而言,所有这些都没有关系。我所观察到的是线程陷入了睡眠,除了主线之外。即使我删除了障碍,主线程仍会继续运行,而其他两个线程永远不会醒来。 – 2012-04-03 19:40:01
非常感谢您的帮助。 – 2012-04-03 19:41:08
也许我可以给你发送一些源文件,但也许这会让事情更加混乱。 – 2012-04-03 19:59:12
我建议为了线程同步使用条件变量。 这里有一些网站关于如何做到这一点,我希望它有帮助。
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
创建一个可以编译一个小例子,或张贴真正相关的代码。伪代码可能没有真实代码所具有的错误/错误。 – nos 2012-04-03 17:05:51
您是否正确设置了t1变量? – 2012-04-03 17:28:45
是的,它设置正确。 – 2012-04-03 17:42:18