MOM*_*Sir 3 c cpu sleep pthreads utilization
所有
我有一个关于pthread_cond_wait()的问题.简而言之,我在一个进程中创建两个POSIX线程,如果我执行以下代码,为什么cpu利用率已满?
我对它进行实验,如果我在bool isNodeConnect3之前删除注释标记,程序似乎没有问题,CPU利用率几乎为0%,换句话说,theads将进入睡眠状态并且不花费CPU资源,这就是我的意思想.
这是一个数据识别问题吗?也许,但我不这么认为,因为我用"#pragma pack(push,1)... #pragma(pop)括起我的结构"你能给我一些建议吗?
环境主机操作系统是win7/intel 64位,客户操作系统是ubuntu 10.04LTS给客户操作系统提供"处理器核心数:4"以下是我的测试代码,你可以用
gcc -o program1 program1.c 构建和运行它- pthread && ./program1获取CPU利用率为25%.结果取决于您的设置.
非常感谢.
码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#include <stdbool.h>
#pragma pack(push,1)
struct BUFF_TX{
pthread_mutex_t mutex_lock;
pthread_cond_t more;
};
struct AtreeNode{
struct BUFF_TX buff_tx;
bool isNodeConnect;
bool isNodeConnect1;
bool isNodeConnect2;
// bool isNodeConnect3; // important
pthread_t thrd_tx;
};
struct AtreeNode treeNode[2];
int tmp[2];
#pragma (pop)
void Thread_TX(int *nodeIdx)
{
int idx = *nodeIdx;
while(1)
{
printf("Thread %d enter mutex lock...\n", idx);
pthread_mutex_lock(&treeNode[idx].buff_tx.mutex_lock);
while(1)
{
if(idx==0)
{
printf("idx==0 wait...\n");
pthread_cond_wait(&(treeNode[0].buff_tx.more), &treeNode[idx].buff_tx.mutex_lock);
}
else if(idx==1)
{
printf("idx==1 wait...\n");
pthread_cond_wait(&(treeNode[1].buff_tx.more), &treeNode[idx].buff_tx.mutex_lock);
}
else
printf("err\n");
}
pthread_mutex_unlock(&treeNode[idx].buff_tx.mutex_lock);
printf("Thread %d leave mutex lock...\n", idx);
}
}
int main(int argc, char *argv[])
{
int i;
int ret;
tmp[0] = 0;
tmp[1] = 1;
for(i=0; i<2; i++)
{
if(pthread_cond_init(&treeNode[i].buff_tx.more, NULL) != 0)
{
printf("cond %d init fail.\n", i);
exit(EXIT_FAILURE);
}
if(pthread_mutex_init(&treeNode[i].buff_tx.mutex_lock, NULL) != 0)
{
printf("mutex lock %d init fail.\n", i);
exit(EXIT_FAILURE);
}
}
for(i=0; i<2; i++)
{
ret = pthread_create(&treeNode[i].thrd_tx, NULL, (void *)Thread_TX, (void *)(&tmp[i]));
if(ret)
{
printf("pthread_create thrd_tx %d err\n", i);
return false;
}
}
pthread_join(treeNode[0].thrd_tx, NULL);
pthread_join(treeNode[1].thrd_tx, NULL);
exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
删除#pragma pack(1)
并忘记你曾经听说过它.您的问题是您传递的指针无效pthread_cond_wait
.pthread_cond_t
具有特定的对齐要求,并且您正在创建不一定与该要求对齐的对象,因此它们的地址无效传递给pthread_cond_wait
.另请参阅https://sourceware.org/bugzilla/show_bug.cgi?id=16549,由于未捕获无效指针使用情况而被MOVED修复为针对GCC的错误报告.
您应该能够通过运行程序strace -f
并查看futex
系统调用失败EINVAL
或类似情况来确认这是否是您的问题的实际原因.