Linux下多线程编程遇到的一些问题

今天在学习了Linux的多线程编程的基础的知识点。于是就试着做了一个简单的Demo。本以为会得到预期的结果。不成想却遇到了意想不到的问题。


代码展示



我的C 代码很简单,就是一个简单的示例程序,如下:

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

int sum  ;
void* runner(void *param);

int main( int argc, char*argv[])
{
    pthread_t tid;
    pthread_attr_t attr;

    if(argc != 2){
        fprintf(stderr,"usage : a.out<integer value>\n");
        return -1;
    }

    if(atoi(argv[1])<0){
        fprintf(stderr,"%d must be >= 0 \n",atoi(argv[1]));
        return -1;
    }

    pthread_attr_init(&attr);
    pthread_create(&tid,&attr,runner,argv[1]);
    pthread_join(tid,NULL);

    printf("Sum = :%d\n",sum);
}

void* runner(void *param){
    int i , upper = atoi(param);
    sum = 0 ;
    for(i = 1; i < upper ; i++){
        sum += i ;
    }
    pthread_exit(0);
}

初遇问题



码完代码我就迫不及待的想要进行编译了,然而系统却提示给了我这样的问题。

g++  -o bin/Debug/PThreadTest obj/Debug/main.o
obj/Debug/main.o:在函数‘main’中:

/home/mark/Code/C/PThreadTest/main.c:25:对‘pthread_create’未定义的引用
/home/mark/Code/C/PThreadTest/main.c:26:对‘pthread_join’未定义的引用

collect2: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))

尝试着解决问题



看到了这样的提示,感觉有可能是Complier的问题吧。一开始我也是不理解到底是为什么会这样。然后我就在网上搜索了一下这些个关键字。网上的答案不一而足,说什么的都有。对于咱这种菜鸟级的入门新手而言,只能去尝试人家的解决方案。所以结果可想而知了,要么成功了,要么失败了。而一般后者出现的概率比较的多。

  • 第一种方式:改变编译器的路径,到setting–>complier–>link complier.然而这并没有解决我的问题,编译过之后,仍旧还是这搁错误
  • 第二种方式:网上说Pthread并不是Linux的默认的库,连接时需要使用库libpthread.a。也就是在编译的时候 添加在*.c 文件的后面。这个方法在我的项目中,竟然成功的运行了。gcc main.c -lpthread -o Main

总结



在遇到了这个问题的时候,从一开始的摸不着头脑,到慢慢的摸索着成功的道路,最后解决问题。我想这就是最基本的解决问题的方式吧。不是说解决问题了,就够了。而是在解决问题的过程中进行不断的思考,总结。这样在今后遇到类似的问题的时候,我们才能更加高效的区解决问题。

编程之路比较的坎坷,脚踏实地的思考,才能最快的解决问题。

时间: 2024-11-10 12:51:50

Linux下多线程编程遇到的一些问题的相关文章

Linux下多线程编程(C语言)

Linux下多线程编程(C语言) 2.6内核开始使用NPTL(Native POSIX Thread Library)线程库,这个线程库有以下几个目标: POSIX兼容,都处理结果和应用,底启动开销,低链接开销,与Linux Thread应用的二进制兼容,软硬件的可扩展能力,与C++集成等. 这里的线程是指用户空间的线程操作 一.线程相关操作 1.1  pthread_t      pthread_t 在头文件  /usr/include/i386-linux-gnu/bits/pthreadt

Linux 的多线程编程的高效开发经验

  简介:          本文中我们针对 Linux 上多线程编程的主要特性总结出 5 条经验,用以改善 Linux 多线程编程的习惯和避免其中的开发陷阱.在本文中,我们穿插一些 Windows 的编程用例用以对比 Linux 特性,以加深读者印象.   背景:    Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们从 5 个方面总结出 Li

Linux的多线程编程的高效开发经验

简介:本文中我们针对 Linux 上多线程编程的主要特性总结出 5 条经验, 用以改善 Linux 多线程编程的习惯和避免其中的开发陷阱.在本文中,我们穿 插一些 Windows 的编程用例用以对比 Linux 特性,以加深读者印象. 背景 Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会 导致程序问题不穷,死锁不断.本文中我们从 5 个方面总结出 Linux 多线程编 程上的问题,

Linux下c++编程中,STL模板的使用。

问题描述 Linux下c++编程中,STL模板的使用. Linux下c++编程,使用STL模板,为什么只识别#include 而不识别#include ? 程序中只要有#include 就会报无数多个错! 解决方案 难道c++标准模板库STL中没有包含queue,你可以去根目录去看看include头文件中有没有queue.h 解决方案二: STL头文件目录是否被include进项目中,如果自己写makefile的话,查看下INCLUDE的目录,如果IDE的话就查看下项目设置中的include选项

linux下多线程,运行显示connect:address already in use

问题描述 linux下多线程,运行显示connect:address already in use linux下多线程,运行显示connect:address already in use 什么情况-- 解决方案 报错信息为,端口被占用. 多线程访问的时候,记得及时的释放链接.并且你可以调一下链接数,调大一些.至少要比你线程数大. 解决方案二: Address already in use: connect解决 Address already in use: connect 的错误Tomcat报

串口通讯-Linux下多线程串口通信问题

问题描述 Linux下多线程串口通信问题 我做的一个项目,把串口读写采用了一个独立的线程,进行数据的读写,在调试时,发现只要启动另外一个计算量比较大的线程,串口通信就出错了,而只要不启动这个线程,可以启动其他线程,串口工作没有任何问题,求原因? 解决方案 在C#中使用SerialPort类实现串口通信,多线程问题在C#中使用SerialPort类实现串口通信 遇到多线程问题在C#中使用SerialPort类实现串口通信 遇到多线程问题 解决方案二: 这两个线程有耦合吧?认真分析一下之间的联系.可

linux下串口编程read函数返回(非超时返回)问题

问题描述 linux下串口编程read函数返回(非超时返回)问题 串口编程经典应用场景:打开串口,阻塞模式,非超时返回,有数据返回,无数据死等. 简易代码为例: void* read_thread(void* param) { char szbuf[128]; int size = 0; while (running) { size = read(fd, szbuf, sizeof(szbuf)); } return 0; } int main() { fd = open(port, O_RDW

Linux下多进程编程(C语言)

Linux下多进程编程(C语言) 一.    进程简介 1.进程是程序的执行.程序是静态的,进程是动态的. 2.进程在内存中有三部分组成:数据段.堆栈段和代码段.          代码段:就是存放程序代码的数据,如果有数个进程运行同一个一个程序,那么它们就可以使用同一个代码段(代码段是可以共享的):          堆栈段:存放的是子程序的返回地址.参数以及程序的局部变量,主要是保存进程的执行的环境,这里用到了栈先进后出的特性,可以看做具有记忆上一次执行的环境.          数据段:存

linux下多线程-linux下 多线程共享数据问题

问题描述 linux下 多线程共享数据问题 环境:linux64位服务器 现有海量文件(按秒级的时间顺序源源不断的来),我需要起多线程读取这些文件,并利用文件内容构建一个比较庞大的数据结构(各种map.list的组合),另外还有一批线程检测这个数据结构某些位置的值并触发具体的任务(当然也可以在构建数据结构的同时进行触发). 问题是: 1.多线程如何并发的构建这个数据结构(结构中的list是需要按照文件到来时间排序的),要对数据结构里面的所有数据都上锁么?上锁上在哪?能不上锁么? 2.如何并行的对