第一次使用pthread,遇到的问题还真不少,现在我一一记录一下:

1.关于编译时出现 对‘pthread_create’未定义的引用 之类的错误的解决:由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:
    gcc -o pthread -lpthread pthread.c

特别的,如果这样还没解决的话:

按照上面编译了一下,还是一样的提示.

后面man gcc
  才知道Usage: gcc [options] file...
  因此需要将库链接放在末尾。
  xs@vm:~/Desktop$ gcc -o pthread pthread.c -lpthread

2.关于pthread里的一些函数.

pthread_join函数:

函数pthread_join用来等待一个线程的结束。
   函数定义: int pthread_join(pthread_t thread, void **retval);
   描述 :
   pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。

参数 :
   thread: 线程标识符,即线程ID,标识唯一线程。
   retval: 用户定义的指针,用来存储被等待线程的返回值。
   返回值 : 0代表成功。 失败,返回的则是错误号。

看下面一段程序:

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
void *thread(void *str)
{
int i;
for (i = 0; i < 10; ++i)
{
sleep(2);
printf( "This in the thread : %d\n" , i );
}
return NULL;
} int main()
{
pthread_t pth;
int i;
int ret = pthread_create(&pth, NULL, thread, (void *)(i)); pthread_join(pth, NULL);
for (i = 0; i < 10; ++i)
{
sleep(1);
printf( "This in the main : %d\n" , i );
} return 0;
}

如果我们注释掉"pthread_join(pth, NULL);"这一行:

运行结果如下:

也就是说:子线程还没有执行完毕,main函数已经退出,那么子线程也就退出了!

如果我们不注释掉那一行,那么运行结果如下:

这说明:pthread_join函数的调用者在等待子线程退出后才继续执行!

pthread_create函数:

声明:

int pthread_create(pthread_t *thread,

                    const pthread_attr_t *restrict_attr,

                    void*(*start_rtn)(void*),

                    void *restrict arg);

参数:

第一个参数*thread为指向线程标识符的指针。
   第二个参数*restrict_attr用来设置线程属性,上面也可以用NULL,表示使用默认的属性。
   第三个参数是线程运行函数的起始地址。
   最后一个参数是运行函数的参数,NULL表示无参数。
   另外,在编译时注意加上-lpthread参数,以调用链接库。因为pthread并非Linux系统的默认库,而是posix线程库,在Linux中将其作为一个库来使用,因此加上 -lpthread(或-pthread)以显示的链接该库。函数在执行错误时的错误信息将作为返回值返回,并不修改系统全局变量errno,当然也无法使用perror()打印错误信息。

pthread_t:pthread_t用于声明线程ID!

类型定义:
   typedef unsigned long int pthread_t;
   //come from /usr/include/bits/pthread.h
   sizeof (pthread_t) =4;

pthread_attr_init函数:

声明:int pthread_attr_init(pthread_attr_t*attr);

返回值:返回0,表示函数初始化对象成功。失败时返回一个错误代码。
   参数:指向一个线程属性的指针。

下面一个程序是书上的:

/*小小的一个程序,折腾人个半死*/
#include <pthread.h>
#include <unistd.h>
#include <stdio.h> int sum;
void *runner (void *param); int main(int argc, char *argv[])
{
pthread_t tid;/*线程标示符*/
pthread_attr_t attr; if (argc != 2)/*如果参数不为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);
return 0;
} void *runner(void *param)/*子线程将会执行这个函数*/
{
int i, upper = atoi(param);
sum = 0;
for (i = 1; i <= upper; i++)
{
sum += i;
}
pthread_exit(0);
}

关于pthread里面一些函数的使用心得!的更多相关文章

  1. (转)使用AfxGetMainWnd函数的一个心得

    作者:朱金灿 来源:http://blog.csdn.net/clever101/ 使用AfxGetMainWnd函数获取MFC程序中的主框架类指针是一个常用作法.但是你会发现这一做法有时也会失灵.不 ...

  2. 关于c语言中qsort函数的一点心得

    今天写c时无意间用到了排序,便想着使用c语言标准库中提供的排序函数,即qsort函数(c++stl中提供了sort函数用于排序),首先是介绍qsort函数的一些基本用法(以下内容转自: http:// ...

  3. 关于boost::function与boost::bind函数的使用心得

    最近开始写一个线程池,期间想用一个通用的函数模板来使得各个线程执行不同的任务,找到了Boost库中的function函数. Boost::function是一个函数包装器,也即一个函数模板,可以用来代 ...

  4. pthread的pthread_join()函数理解实验

    一.使用方式 pthread_t tid;pthread_create(&tid, NULL, thread_run,NULL);pthread_join(tid,NULL);创建线程之后直接 ...

  5. Windows编程中回调函数的使用心得(MFC篇)

    回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定 ...

  6. 查询pthread库的函数

    首先需要先安装pthread看的手册文档,然后用如下命令查询: man -k pthread

  7. MySQL中的find_in_set()函数使用技巧心得与应用场景总结

    Author:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,CSDN官方首发原创文章 企业博客 CSDN.com 个人博 ...

  8. 线程模型、pthread 系列函数 和 简单多线程服务器端程序

    一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用 ...

  9. js函数式编程——蹦床函数

    概述 这是我在学习函数式编程的时候,关于递归,尾递归,相互递归和蹦床函数的一些心得,记下来供以后开发时参考,相信对其他人也有用. 参考资料:JavaScript玩转Clojure大法之 - Tramp ...

随机推荐

  1. 使用Listener准备application作用域数据

    在程序中.有些数据我们希望在程序启动的时候就准备好,而且仅仅准备一次,放在application作用域中,这时候.我们一般会用Listener来准备这些数据. 可是,用Listener准备applic ...

  2. Android开发ScrollView上下左右滑动事件冲突整理一(根据事件)

    主要通过重写 onInterceptTouchEvent 事件来解决,代码如下: package com.cm.android.pad.view.itemView; import android.co ...

  3. openstack初探

    一 .openstack三大核心功能: 计算--Nova.存储--Cinder.网络--Neutron. Nova:提供了计算资源的管理,可以管理跨服务网络的VM实例.还提供对多种Hypervisor ...

  4. Android内存泄漏的各种原因详解

    转自:http://mobile.51cto.com/abased-406286.htm 1.资源对象没关闭造成的内存泄漏 描述: 资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我 ...

  5. Word复制和替换实例

    public string Path { get { DirectoryInfo info = new DirectoryInfo(Application.StartupPath); return i ...

  6. 抓取锁的sql语句-第三次修改

    CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000); --定义 v_sql 接受抓取锁的sql语句CUR_LOCK SYS_R ...

  7. MySQL 创建数据表

    MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: CREATE TABLE table_name (col ...

  8. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第三章:搜索、高级过滤和视图模型

    在这一章中,我们首先添加一个搜索产品的模块以增强站点的功能,然后使用视图模型而不是ViewBag向视图传递复杂数据. 注意:如果你想按照本章的代码编写示例,你必须完成第二章或者直接从www.apres ...

  9. javascript之typeof、constructor、instanceof

    ref: http://jingyan.baidu.com/article/29697b912f9939ab20de3c8c.html

  10. Oracle的卸载与安装

    今天在做一个CURD的web小应用,为后面使用ExtJS搭建一个后台.因为还没有使用过Oracle数据库,因此今天也特的地的使用oracle数据库作为后台的数据库,也当练习使用oracle. 但是今天 ...