使用pthread实现矩阵乘法时报pthread_create/join未定义引用错误求助
报错解决方法
1 链接错误直接修复方案
你遇到的undefined reference to 'pthread_create'、undefined reference to 'pthread_join'属于编译链接阶段错误,和代码逻辑无关:pthread线程库不属于g++/gcc的默认链接库,编译时需要手动指定链接参数。
编译命令加上-lpthread即可,示例:
g++ 你的源文件名.cpp -o matrix_mul -lpthread
2 代码逻辑存在的其他问题
就算解决了链接报错,你的代码依然无法正常运行,还需要修改以下问题:
- 缺少iostream头文件:代码中使用了cout但未引入对应头文件,需要在头部增加
#include <iostream> - 矩阵内存分配时机错误:你在全局区域定义矩阵指针时就执行了new操作,此时MAX_m、MAX_l都是未赋值的初始0值,后续main中修改参数后也不会重新分配内存,会出现内存越界崩溃。需要把三个矩阵的new操作移动到main函数中,读取完argv传入的三个参数之后再执行。
- 线程行号分配存在并发安全问题:用全局变量
rd_i++给线程分配计算行号的逻辑在多线程下不是原子操作,会出现多个线程拿到同一个行号、行号跳变的问题。而且你当前pthread_create传入的第四个参数是未初始化的野指针,完全没有用到,正确做法是把当前循环的i值作为参数传给线程,用来指定每个线程要计算的行范围,比如2个线程的场景下给第一个线程传0、第二个传2,线程函数内计算对应范围的行即可。 - 矩阵输出逻辑错误:你现在每个元素输出后都执行了endl换行,会导致每个元素单独占一行,无法正常展示矩阵结构,需要把endl操作移到每行的内层循环结束之后执行。
- 行号无边界校验:如果传入的线程数大于矩阵C的行数,rd_i自增会超出matC的下标范围,引发内存越界。
内容的提问来源于stack exchange,提问作者Zoof
相关产品推荐
相关产品推荐

