全部
我有一个关于pthread_cond_wait()的问题。
简而言之,我在一个进程中创建两个posix线程,
如果我执行以下代码,为什么CPU使用率已满?
我做了一些实验,如果在bool isnodeconnect3之前删除注释标记,
程序似乎没有问题,CPU利用率几乎为0%,换句话说,
Theads将进入睡眠状态,不占用CPU资源,这是我想要的。
是数据分析问题吗?
也许吧,但我不这么认为,因为我用“pragma pack(push,1)…”将结构括起来。#杂注(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);
}

最佳答案

删除#pragma pack(1)并忘记您曾经听说过它。您的问题是,您将一个无效指针传递给pthread_cond_waitpthread_cond_t有一个特定的对齐要求,您正在创建的对象不一定与该要求对齐,因此它们的地址不能传递给pthread_cond_wait。另请参见https://sourceware.org/bugzilla/show_bug.cgi?id=16549,这是通过移动到针对gcc的错误报告来解决的,因为它没有捕捉到无效的指针用法。
您应该能够通过在strace -f下运行您的程序并看到futex系统调用在EINVAL或类似的情况下失败来确认这是否是问题的实际原因。

10-06 10:29
查看更多