一次多线程debug经历

关键词:strcmo-sse2-unaligned.S

在Linux下学习多线程编程,却出现了一个莫名奇妙的错误。如下:

Can't find a source file at "build/glibc-bfm8x4/glibc-2.23/string/../sysdeps/x86_64/miltiarch/strcmp-sse2-unaligned.S"

一次多线程debug经历_第1张图片

在网上查找,只有overstackflow上有一个同学遇见了同样的问题,下面的回答是安装glibc库,这个不是默认安装的库么?安装方法如下:

git clone https://github.com/jeremie-koenig/glibc /opt/src/glibc

然而,安装后,还是没有用。看看源代码。

//线程回调函数

void * thread_func(void *msg)
{
    int i = 0;
    char *ptr = msg;
    sleep(1);

    //给互斥量加锁,以确保同一时间只有该线程可以拥有互斥量
    pthread_mutex_lock(&mutex);
    while(strcmp("end\n",msg)!=0)
    {
        //把小写字母变成大写字母
        for(i = 0;ptr[i]!='\0';i++)
        {
            if(ptr[i]>='a' && ptr[i]<='z')
            {
                ptr[i] -= ('a'-'A');
            }
        }

        printf("You input %d characters\n",i-1);
        printf("To uppercase:%s\n",ptr);

        //给互斥量接锁,以确保同一时间只有该线程可以拥有互斥量
        pthread_mutex_unlock(&mutex);
        sleep(1);
        pthread_mutex_lock(&mutex);
    }   
    pthread_mutex_unlock(&mutex);

    pthread_exit(NULL); 
}


//main
...

//创建子线程,将msg作为参数传入
    if(pthread_create(&thread,NULL,thread_func,NULL)!=0)
    {
        perror("cannot create thread\n");
        exit(EXIT_FAILURE);
    }
...

问题就出现在在创建子线程的时候,传入了NULL作为参数。而线程函数中,是要传入一个字符串作为参数的。从而导致了

while(strcmp("end\n",msg)!=0)

实际上运行了

strcmp("end\n",NULL);

而NULL是(void*)0。这个地址根本就不能拿来作为strcmp参数。按照正常报错,应该是报segement fault,但是编译器给我报了个找不到某个文件。
正确的创建子线程应该是:

...
    char msg[512] = {0};
    if(pthread_create(&thread,NULL,thread_func,msg)!=0)
    {
        perror("cannot create thread\n");
        exit(EXIT_FAILURE);
    }

总结:

这个错误是晚上才发现的,当时已经睡意朦胧,看了报错,就想当然认为是glibc库有什么问题。编译器并不是万能的,能准确报错,下次遇见没有见过的棘手的错误,应该首先读一读一下代码,用眼睛debug一下,再去网上求救。
最近在看linux多线程的东西和各种搬家聚会的,leetcode没接着刷了。做为一个非专业的,刷这些还是没有计算机的学生顺手啊。

你可能感兴趣的:(一次多线程debug经历)