线程编译
C语言要求除main函数外 所有的函数必须先声明才能使用 你可以在函数定义的时候一起声明这个函数 但是在这个函数定义之前不能使用这个函数
下面用通俗点的语言讲: 你在main函数中调用了thread函数, 但是如果你把void *thread(void *vargp);删掉了, 那么编译器就找不到这个函数了(因为编译器是从前往后编译这个程序的) 因此编译器是通不过的
有两种方法, 一种就是像你之前写的 先声明这个函数 第二种是把void *thread(void *vargp){...}放到main函数的前面.
有些返回值和参数类型为int型的函数也可以不用声明, 编译器也能通过, 不过这是不建议的 也是不符合标准的
标准建议每个函数都应该给出它们的显式的声明
希望你懂了 嘿嘿
㈡ java多线程编译不通过
JDK 1.6.0编译通过,尽管这个文件名字和类名不匹配。
JDK 1.6.0运行成功,
java -classpath . TreadDemo
通常java线程是用一个类实现Runnable接口,然后再创建一个线程对象让工作跑起来。
这种做法在多个并发工作彼此之间有竞争和同步的需要的时候,就显现出优势了。
㈢ gcc编译线程程序,为什么要加-lpthread,头文件已经包含了<pthread.h>了啊
-lpthread是链接库,
<pthread.h>只有申明,实现部分都在库里面。
创建线程时一般是把函数的指针做参数,所以要加一个取地址符号。
ret=pthread_create(&id,NULL,(void *)&thread,NULL);
另外,建议要检查一下创建线程的返回值ret是否成功,防止影响后面的代码。
(3)线程编译扩展阅读:
每个语言编译器都是独立程序,此程序可处理输入的原始码,并输出组合语言码。全部的语言编译器都拥有共通的中介架构:一个前端解析符合此语言的原始码,并产生一抽象语法树,以及一翻译此语法树成为GCC的暂存器转换语言〈RTL〉的后端。
编译器最佳化与静态程序码解析技术(例如FORTIFY_SOURCE,一个试图发现缓冲区溢位〈buffer overflow〉的编译器)在此阶段应用于程序码上。最后,适用于此硬件架构的组合语言程序码以Jack Davidson与Chris Fraser发明的算法产出。
㈣ linux里面线程编译运行问题
#gcc a.c -o a #此句的-o a说明输出目标文件为“a”;
#gcc -Wall-lpthread threadcreatetest.c #此句未注明输出目标文件名,系统默认输出为a.out,所以编译之后执行./a.out文件。
如果上句也没有指明“ -o a ”的话,输出也是a.out,你可以试试
㈤ make 多线程编译会出错么
程序没有问题,看看MAKEFILE30行是不是有什么错误,或者换个工程配置,这个应该和工程的配置有关,程序这么简单,一点问题没有。
㈥ 为什么有时编译选项要改成多线程才能编译通过,而 单线程就不行呢
主要是libc(C函数)库不同,有时链接时会看到libcd.lib/libc.lib/libcmt.lib...这些东东,就是针对不同的线程环境所使用的。不过在VS2005之后,不再使用单线程库了,它只使用libc*mt.lib,也就是有很多老程序代码在VS2005下找不到LIBCD.lib的原因。
如果你在程序中使用了_beginthread之类的函数,那么就会链接到多线程的c函数库,单线程选项当然不能使用了。
而使用FORCE:MUTIPLE和这个没有多大关系,它可能在同时使用了单线程库和多线程库时起到了忽略多个重叠符号错误的作用。
㈦ 线程编译linux,怎么错了~谢了
这一句:
ret=pthread_create(&id2,NULL,(void*)myThread2.NULL);
逗号写成了点号,改为:
ret=pthread_create(&id2,NULL,(void*)myThread2, NULL);
编译时加链接线程库:
CC xx.c -o xx -lpthread
㈧ LINUX下多线程编译问题
你编译的时候有加多线程连接选项吗? 要加上 -lpthread 或者 -pthread (尽量选后者)
例如 gcc -pthread -o test main.cpp
另外你的线程创建的不对,函数指针不能强转类型(这里也不用转)
pthread_create(&procter_t,NULL,(void*)procter_f,NULL);
pthread_create(&consumer_t,NULL,(void*)consumer_f,NULL);
应该是
pthread_create(&procter_t,NULL,procter_f,NULL);
pthread_create(&consumer_t,NULL,consumer_f,NULL);
㈨ QT如何进行线程编译
在Qt中使用多线程,目前就我使用过的有两种,一是子类化QThread,重写run函数,在run函数里实现自己的代码,这一部分代码通常是比较耗时,或者干脆直接阻塞的。比如一个while循环,设置一个标志,判断循环结束。
这样的例子在网上有很多,就不写了。
这样写的话,会有一些东西需要了解。
子类化QThread的方法,只有run函数里面的内容是执行在子线程里的,其他的部分,比如槽函数什么的还是在主线程里执行(假设是在主线程开启的该子线程)。
还有一种方法,是子类化QObject,新建一个线程,然后使用MoveToThread把这个类的对象移到新建的线程中,这种做法使得它所有的槽函数都是执行在新开辟的线程里面。
如果直接(QObject对象).abc()的话,这个成员函数是在主进程内执行,可能会出现"QObject::killTimer: timers
cannot be stopped from another thread"的运行错误。
使用第二种方法的话,貌似会遇到这样的问题:如果在一个槽函数中把子线程阻塞,其他的槽函数无法接受来自主线程
㈩ linux下线程pthread编译时为什么要加lpthread
shibixiao | 六级
lpthread是表示要连接到pthread的库是这里省略的lib,你应该可以找到共享库libpthread.so的
因为pthread编程用到的函数在pthread库里面,就像你使用pow等数学计算函数,需要用到math.h
需要 -lm