美文网首页
pthread_create传参问题

pthread_create传参问题

作者: 大爷来了啊 | 来源:发表于2020-08-31 15:38 被阅读0次

回顾下多线程基础,随手写了个bug。

#include <unistd.h>
#include <pthread.h>
#include <stdio.h>

const int MAXNUM = 10;

void *func(void  *arg)
{
    int *pInt = (int *)arg;
    printf("pthread_id = %ld, arg = %d\n",pthread_self(),*pInt);
}

int main(int argc,char *argv[])
{
    pthread_t pthreads[MAXNUM];
    for(int i = 1;i <= MAXNUM;i++)
    {
        pthread_create(&pthreads[i],NULL,func,(void *)&i);
    }
    sleep(2);
    for(int i = 1;i <= MAXNUM;i++)
    {
        pthread_join(pthreads[i],NULL);
    }
}

编译:gcc -lpthread main.c -o main
出错:

对‘pthread_create’未定义的引用 
对‘pthread_join’未定义的引用
collect2: error: ld returned 1 exit status

把链接库换个位置 gcc main.c -o main -lpthread,这样就行了,Ubuntu真操蛋。
运行下试试:

捕获.PNG
嗯?
为啥?
出错了?
找谁背锅?

问题出在了传参上,so加个打印参数地址瞅瞅。

    printf("arg address = %p\n",arg);

搞一把:

捕获.PNG
地址都一样,为啥呢?

其实问题出在了传参方式上,对所有线程来说它们公用 i的地址。在线程创建的时候并非先创建的就一定先执行,后创建的进程可能会把 i的值修改掉,所以导致在运行函数中去取 i的值是不准确的。

改进

方案一:(void *)&i ===> (void *)i;

搞一把:


捕获.PNG

gdb登场

捕获.PNG
问题一目了然,非法访问内存,这个解决方案有点拍脑袋了。
方案二:
    int *tmp = (int *)malloc(sizeof(int));
    *tmp = i;
    (void *)&i ===> (void*)tmp;

搞一把:


捕获.PNG

嗯,这回正常了,不过要记得有个malloc没有释放。

总结

就算是拍脑袋也要搞一把

相关文章

  • pthread_create传参问题

    回顾下多线程基础,随手写了个bug。 编译:gcc -lpthread main.c -o main出错: 把链接...

  • 多线程传参问题

    多线程传参,分为两种方式。一种是设置 ==全局变量==;另一种是通过int pthread_create((pth...

  • Navigation的一些问题

    1.startDestination传参和重定向问题 2.fragment返回传参问题 我们知道Activity可...

  • java传参问题

    java传参的问题,可以通过如下三个例子进行说明: 例一: 例二: 例三: 总结:如果形参是基本类型,实参传递传递...

  • mybatis传参问题

    【单参数】 public List getXXBeanList(String xxCode); s...

  • 02 - 传参问题

    一、.wxml 获取 .js 定义的数据: {{data}} 二、.js 获取 .wxml 的数据,一般都是在 e...

  • setTimeout传参问题

    IE8下参数接受失败的解决方案: 参考 :https://www.jb51.net/article/40524.htm

  • URL 传参问题

    业务场景:微信小程序中A页面带参数跳转B页面 由于card数据比较大,导致JSON解析的时候报错:Unexpect...

  • Python参数传递,既不是传值也不是传引用

    面试的时候,有没有被问到Python传参是传引用还是传值这种问题?有没有听到过Python传参既不是传值也不是传引...

  • vue - 路由带参跳转

    vue路由传参按照传参方式可划分为params传参和query传参; params传参分为在url中显示和影藏参数...

网友评论

      本文标题:pthread_create传参问题

      本文链接:https://www.haomeiwen.com/subject/gixprktx.html