Linux多线程程序设计学习笔记

1.什么是线程,线程与进程之间的关系

 

2.创建线程

进程被创建时,系统会为其创建一个主线程,而要在进程中创建新的线程,则可以调用pthread_create:

 

 

//若线程创建成功,则返回0。若线程创建失败,则返回出错编号

//编译时需要调用libpthread

 

3.实例代码

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
 
voidprintids(constchar *s)
{
    pid_t pid;
    pthread_t tid;
    pid = getpid();
    tid = pthread_self();    //也可以通过这种方式,在创建后得到自身的进程ID
    printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int) pid,
            (unsignedint) tid, (unsigned int) tid);
}
 
void*thr_fn(void*arg)    //注意函数类型
{
    printids("new thread: ");
    returnNULL;
}
 
intmain(void)
{
    interr;
    pthread_t ntid;  //进程ID
    err = pthread_create(&ntid, NULL, thr_fn, NULL);
    if(err != 0)
        printf("can't create thread: %s\n",strerror(err));
    printids("main thread:");
    pthread_join(ntid,NULL);      //后面介绍这个函数
    returnEXIT_SUCCESS;
} 


 

 

4.编译实例

gcc pthread_creat.c -o pthread_creat -lpthread

 

5.线程终止

(1)执行完成后隐式退出; 

(2)由线程本身显示调用pthread_exit 函数退出; 


(3)被其他线程用pthread_cance函数终止: // 在某线程中调用此函数,可以终止由参数thread 指定的线程。 

      

 

6.线程等待

 如果一个线程要等待另一个线程的终止,可以使用pthread_join函数,该函数的作用是调用pthread_join的线程将被挂起直到线程I

D为参数thread的线程终止。

函数定义: int pthread_join(pthread_t thread, void **retval);

thread: 线程标识符,即线程ID,标识唯一线程。

retval: 用户定义的指针,用来存储被等待线程的返回值。

返回值 : 0代表成功。 失败,返回的则是错误号。

 

7.pthread文件相关总结

数据类型

pthread_t:线程句柄

pthread_attr_t:线程属性

 

操纵函数:

pthread_create():创建一个线程

pthread_exit():终止当前线程

pthread_cancel():中断另外一个线程的运行

pthread_join():阻塞当前的线程,直到另外一个线程运行结束

pthread_attr_init():初始化线程的属性

pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)

pthread_attr_getdetachstate():获取脱离状态的属性

pthread_attr_destroy():删除线程的属性

pthread_kill():向线程发送一个信号

 

同步函数

pthread_mutex_init() 初始化互斥锁

pthread_mutex_destroy() 删除互斥锁

pthread_mutex_lock():占有互斥锁(阻塞操作)

pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。

pthread_mutex_unlock(): 释放互斥锁

pthread_cond_init():初始化条件变量

pthread_cond_destroy():销毁条件变量

pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程

pthread_cond_wait(): 等待条件变量的特殊条件发生

Thread-local storage(或者以Pthreads术语,称作线程特有数据):

pthread_key_create(): 分配用于标识进程中线程特定数据的键

pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定

pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中

pthread_key_delete(): 销毁现有线程特定数据键

 

工具函数

pthread_equal(): 对两个线程的线程标识号进行比较

pthread_detach(): 分离线程

pthread_self(): 查询线程自身线程标识号

 

 

8.多线程编程实例

//Threads.cpp
#include <iostream>
#include <unistd.h>
#include <pthread.h>
using namespace std;

void *thread(void *ptr)
{
    for(int i = 0;i < 3;i++) {
        sleep(1);
        cout << "This is a pthread." << endl;
    }
    return 0;
}

int main() {
    pthread_t id;
    int ret = pthread_create(&id, NULL, thread, NULL);
    if(ret) {
        cout << "Create pthread error!" << endl;
        return 1;
    }
    pthread_join(id, NULL);
for(int i = 0;i < 3;i++) 
  { cout << "This is the main process." << endl; 
    sleep(1); 
  }
    return 0;
} 

 

 //产生的结果就是先执行id那个进程,之后才会执行下面的for循环。

 

 

 

 

 



 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值