`

pthread_create用法

阅读更多

今天开始学习linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。


#include <pthread.h>

int pthread_create(pthread_t *restrict
tidp,
const pthread_attr_t *restrict
attr,
void *(*
start_rtn)(void),
void *restrict
arg);

Returns: 0 if OK, error number on failure


C99 中新增加了 restrict 修饰的指针: 由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。

第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。

下面这个程序中,我们的函数
thr_fn不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。

#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>

pthread_t ntid;

void printids(const char *s){
	pid_t pid;
	pthread_t tid;

	pid = getpid();
	tid = pthread_self();
	printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid,(unsigned int)tid,(unsigned int)tid);
}

void *thr_fn(void *arg){
	printids("new thread:");
	return ((void *)0);
}

int main(){
	int err;

	err = pthread_create(&ntid,NULL,thr_fn,NULL);
	if(err != 0){
		printf("can't create thread: %s\n",strerror(err));
		return 1;
	}

	printids("main thread:");
	sleep(1);
	return 0;
}
 

 

把APUE2上的一个程序修改一下,然后编译。
结果报错:

pthread.c:(.text+0x85):对‘pthread_create’未定义的引用


由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:
gcc -o pthread -lpthread pthread.c

 

分享到:
评论

相关推荐

    undefined reference to ‘pthread_create’的解决方法

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

    pthread_doc

    与 fork() 调用创建一个进程的方法不同,pthread_create() 创建的线程并不具备与主线程(即调用 pthread_create() 的线程)同样的执行序列,而是使其运行 start_routine(arg) 函数。thread 返回创建的线程 ID,而 ...

    基于pthread_create,readlink,getpid等函数的学习与总结

    以下是对pthread_create,readlink,getpid等函数的用法进行了详细的分析介绍,需要的朋友可以参考下

    linux系统编程之线程.zip

    注意:不应使用全局变量 pthread_t tid,在子线程中通过pthread_create传出参数来获取线程ID,而应使用pthread_self。 pthread_create函数 创建一个新线程。 其作用,对应进程中fork() 函数。 int pthread_create...

    演示pthread用法

    演示pthread用法,pthread_create函数用户

    Linux系统编程之线程同步

    pthread_create(&tid, NULL, tfn, NULL); while (1) { printf("HELLO "); sleep(rand() % 3); printf("WORLD\n"); sleep(rand() % 3); } pthread_join(tid, NULL); return 0; } ...

    多线程API.zip

    常见的多线程API和用法 pthread_self函数 pthread_create函数 pthread_exit函数 pthread_join函数 pthread_detach函数 pthread_equal函数

    操作系统实验报告.docx

    实验四 利用信号量实现进程控制 一、实验目的 学习 UNIX 类操作系统信号量机制,编写Linux环境下利用信号量实现进程控制的方法,掌握相关系统调用的使用方法。 二、实验内容 创建四个线程,其中两个线程负责从文件...

    Android中实现开机自动启动服务(service)实例

    最近在将 HevSocks5Client 移植到 Android 上了,在经过增加...Java 中调用 native 程序我选择使用 JNI 方式,直接在 JNI_OnLoad 方法中调用 pthread_create 创建个线程跑原来的 main 就行啦。 代码如下:…#if defined

    linux网络编程-宋敬彬-part2

    4.4.2 Linux下线程创建函数pthread_create() 129 4.4.3 线程的结束函数pthread_join()和pthread_exit() 129 4.4.4 线程的属性 130 4.4.5 线程间的互斥 132 4.4.6 线程中使用信号量 133 4.5 小结 136 第2...

    linux网络编程-宋敬彬-part3

    4.4.2 Linux下线程创建函数pthread_create() 129 4.4.3 线程的结束函数pthread_join()和pthread_exit() 129 4.4.4 线程的属性 130 4.4.5 线程间的互斥 132 4.4.6 线程中使用信号量 133 4.5 小结 136 第2...

    协程基础库Libco.zip

    它们跑在多进程或者多线程环境下,希望改造为异步服务改造方法:在进程/线程内创建多个coroutine( 使用co_create ),每个routine内部enable_sys_hook, 业务逻辑代码移到routine里面执行,那你所有的同步代码立即自动...

    r40_tinav2.1_最终验证通过_使用CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z

    r40_tinav2.1_最终验证通过_使用CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z 开发板:CB-S 1、(可选修改/调试技巧:) 除了ov5640.c之外,其它的驱动都不编译,节省编译时间!...

    linux网络编程-宋敬彬-part1

    4.4.2 Linux下线程创建函数pthread_create() 129 4.4.3 线程的结束函数pthread_join()和pthread_exit() 129 4.4.4 线程的属性 130 4.4.5 线程间的互斥 132 4.4.6 线程中使用信号量 133 4.5 小结 136 第2...

    gc2145_tinav2.1验证完成20170523_1648.7z

    static int capture_frame(void* capture,int (*set_disp_addr)(int,int,unsigned int*),pthread_mutex_t* mutex) { …… //sync capture info perp x second #define M_SECOND 200 if(is_x_msec(M_SECOND,(long ...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

     pthread_create(&tid, NULL, (void*(*)(void*))soap_serve, (void*)&soap1);  ...  soap_init(&soap2);  soap_call_ns__method(&soap2, ...); // 调用远程方法  ...  soap_end(&soap2);  ...  pthread_join...

    worker-threads:简单的老板和长寿的工人 pthread 示例

    老板/工人线程的简单示例在工作线程内执行一些“阻塞”功能的简单示例代码。 老板创建了许多不同类型的任务线程,这些线程将... 用法 它的用法与'create'/'join' 非常相似,没有每次需要工作时都必须创建新线程的开销。

    static 用法

    static关键字是C, C++中都存在的关键字, 它主要有三...另外, 在设计类的多线程操作时, 由于POSIX库下的线程函数pthread_create()要求是全局的, 普通成员函数无法直接做为线程函数, 可以考虑用Static成员函数做线程函数

    MFC的程序框架剖析

    一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    7.3.2 用pthread_create创建线程 168 7.3.3 更新示例应用程序以使用POSIX线程 169 7.3.4 执行POSIX线程示例 174 7.4 从POSIX线程返回结果 174 7.5 POSIX线程同步 176 7.5.1 用互斥锁同步POSIX线程 176 7.5.2 ...

Global site tag (gtag.js) - Google Analytics