pthread库(pthread库函数)

http://www.itjxue.com  2023-02-25 00:25  来源:未知  点击次数: 

如何在cmake中引用静态库(.a)

1.头文件

include存放的是编译库文件生成的头文件集合,比如curl目录,目录中都是.h文件,添加方式如下:

2.库文件

lib是存放库文件的目录,形如libxxx.so或libxxx.a形式的文件,添加方式如下:

3.引用

库的引用可以直接取libxxx.a中的xxx部分,如下的curl、ssl、crypto就是:

1.编译报错“undefined reference to `pthread_create'”

解决办法:引入pthread库

2.编译报错“libcrypto.a undefined reference to symbol 'dlclose'”

解决办法: add -ldl after libcrypto and libssl in your link command.

如何实现多线程控制

1、使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。

2、例程:

#include pthread.h

#include stdio.h

#include sys/time.h

#include string.h

#define MAX 10

pthread_t thread[2];

pthread_mutex_t mut;

int number=0, i;

void *thread1()

{

printf ("thread1 : I'm thread 1\n");

for (i = 0; i MAX; i++)

{

printf("thread1 : number = %d\n",number);

pthread_mutex_lock(mut);

number++;

pthread_mutex_unlock(mut);

sleep(2);

}

printf("thread1 :主函数在等我完成任务吗?\n");

pthread_exit(NULL);

}

void *thread2()

{

printf("thread2 : I'm thread 2\n");

for (i = 0; i MAX; i++)

{

printf("thread2 : number = %d\n",number);

pthread_mutex_lock(mut);

number++;

pthread_mutex_unlock(mut);

sleep(3);

}

printf("thread2 :主函数在等我完成任务吗?\n");

pthread_exit(NULL);

}

void thread_create(void)

{

int temp;

memset(thread, 0, sizeof(thread)); //comment1

/*创建线程*/

if((temp = pthread_create(thread[0], NULL, thread1, NULL)) != 0) //comment2

printf("线程1创建失败!\n");

else

printf("线程1被创建\n");

if((temp = pthread_create(thread[1], NULL, thread2, NULL)) != 0) //comment3

printf("线程2创建失败");

else

printf("线程2被创建\n");

}

void thread_wait(void)

{

/*等待线程结束*/

if(thread[0] !=0) { //comment4

pthread_join(thread[0],NULL);

printf("线程1已经结束\n");

}

if(thread[1] !=0) { //comment5

pthread_join(thread[1],NULL);

printf("线程2已经结束\n");

}

}

int main()

{

/*用默认属性初始化互斥锁*/

pthread_mutex_init(mut,NULL);

printf("我是主函数哦,我正在创建线程,呵呵\n");

thread_create();

printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");

thread_wait();

return 0;

}

ubuntu 下没有pthread库 怎么办

buntu 下默认是没有pthread库 的 即使在编译的时候 加上 -lpthread 也不行

man不到相关函数

使用下面的指令安装 就可以了

sudo apt-get install glibc-doc

sudo apt-get install manpages-posix-dev

然后在用man -k pthread_create就可以找到了

怎样彻底解决"undefined reference to pthread

问题原因:

pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。

问题解决:

在编译中要加 -lpthread参数

gcc thread.c -o thread -lpthread

thread.c为你些的源文件,不要忘了加上头文件#includepthread.h

如何静态链接pthreads-win32

pthreads-win32是windows下的pthread库,它默认采用的是动态链接库的链接方式,因此在使用该库的程序都需要带上一个动态库pthreadVC2.dll,感觉挺不方便的,下面介绍如何静态链接pthreads-win32:

首先要编译静态库: 从ftp //sources redhat com/pub/pthreads-win32/下载最新的库安装包,笔者下载的是pthreads-w32-2-8-0-release.exe,自解压到一个目录,用vc7打开pthreads.2目录下的pthread.dsw,会提示工程版本转换,选择全是,然后打开该工程的属性页,在“常规”选项页的配置类型选择“静态库(.lib)”,在“c/c++”选项页的预处理器定义删除_USRDLL和PTW32_BUILD,添加PTW32_STATIC_LIB,确定保存即可。当然,你需要根据你的需要选择运行时库的类型。最后重新生成pthread便可生成我们需要的pthread.lib。

下面讲述如何使用前面生成的静态库:新建一个控制台工程,将pthread.lib拷贝到工程目录,在预处理器定义中添加PTW32_STATIC_LIB,附加包含目录添加pthreads-win32代码所在目录,笔者是E:/pthreads/pthreads.2,附加依赖项添加Ws2_32.lib和pthread.lib即可,简单使用代码如下:

#include iostream

#include "pthread.h"

void * Function_t(void * Param)

{

std::cout "我是线程!" std::endl;

pthread_t myid = pthread_self();

printf( "线程ID = %d", myid );

return NULL;

}

int main()

{

#ifdef PTW32_STATIC_LIB

pthread_win32_process_attach_np();

#endif

pthread_t pid;

pthread_attr_t attr;

pthread_attr_init(attr);

pthread_attr_setscope(attr, PTHREAD_SCOPE_PROCESS);

pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED);

pthread_create(pid, attr, Function_t, NULL);

std::cout "========================================" std::endl;

getchar();

pthread_attr_destroy(attr);

#ifdef PTW32_STATIC_LIB

pthread_win32_process_detach_np();

#endif

return 1;

}

其中

#ifdef PTW32_STATIC_LIB

pthread_win32_process_attach_np();

#endif

#ifdef PTW32_STATIC_LIB

pthread_win32_process_detach_np();

#endif

对于静态链接方式非常重要,如果没有这段代码,线程将创建失败。

(责任编辑:IT教学网)

更多