您的位置:首页 > 其它

POSIX thread library 简介I

2013-09-08 02:10 225 查看
(1) 进程和线程有关背景知识

1. 进程包括程序资源和程序执行状态等相关信息:

Process ID, Process Group ID, User ID and Group ID

Environment

Working Directory

Program Instructions

Registers

Stack

Heap

File Desprictors

Singal Action/Singal Libraries

Inter-Process Communication Tools(Such as message queues, pipes, semaphors, shared memory)

2.一个进程中的多个线程共享一下资源:

Address Space

Process Instruction

Open Files

Singals/Singal Handlers

Working Directory

User and Group ID

但是每个线程拥有一下唯一资源:

Therad ID

Registers/Stack Pointer

Stack For Local Variables/Return Address

Singal Mask

Priority

Return Value

(二) POSIX(Portable Operating System Interface),中文名称为“可移植操作系统接口”,是IEEE为了

保持Unix和其他操作系统之间的兼容性为定义的一组操作的API。

POSIX thread library是针对C/C++多线程编程的标准库,头文件形式为<pthread.h>。

pthread API将线程函数分为四个主要的部分:

1.线程管理(Thread Management):包括线程的eating、detaching以及joining。

2.Mutexes:用来处理线程之间的同步(Synchronization),是“Mutex Exclusion”的缩写。

3.Condition Variables:用来处理共享一个mutex的几个线程之间的通信。

4.Synchronization:包括读写locks和barriers。

介绍几个常见的函数:

1.线程创建函数:int pthread_create(pthread_t* thread, const pthread_attr_t* attr,

                 void* (*start_routine)(void*), void* arg);

参数意义:

thread: 返回线程ID。

attr: 线程属性,设置为NULL,使用默认的线程属性。

start_routine: 函数指针指向线程将要调用的函数,该函数有一个void类型的指针值。

arg: 指向线程调用函数实参的指针。如果要向该函数传递多个参数,该指针要指向一个结构体。

返回值:

如果线程创建成功,返回0,;否则返回一个数值代表出现错误。

2.线程结束函数:void pthread_exit(void* extr);

参数意义:

extr: 线程的返回值。该函数用来终结线程,无返回值。

例如有如下示例程序:

#include <iostream>
#include <pthread.h>

void *print_message_function(void *ptr) {
char* message = NULL;
message = (char*)ptr;
std::cout << message << std::endl;
}

int main(int argc, char* argv[]) {
pthread_t th1, th2;
char *message1 = "Thread 1";
char *message2 = "Thread 2";

int iret1 = 0;
int iret2 = 0;
iret1 = pthread_create(&th1, NULL, &print_message_function, (void*)message1);
iret2 = pthread_create(&th2, NULL, *print_message_function, (void*)message2);

pthread_join(th1, NULL);
pthread_join(th2, NULL);

return 0;
}


3. 等待另外一个线程结束:int pthread_join(pthread_t thread, void** thread_return);

参数意义:

thread: 线程被挂起,直到ID为thread的线程执行结束。

thread_return: 如果该参数不为空,则线程thread的返回值存储在指针thread_return所指的内存位置。

返回值:

成功返回值为零,否则返回一个非零值指示操作不成功。

例如,有如下例子:

#include <iostream.h>
#include <pthread.h>
#include <stdlib.h>
#include <math.h>

void* BusyWork(void* t) {
int i = 0;
long tid = 0;
double res = 0.0;
tid  = (long)t;
std::cout << "Thread " << tid << "Starting......\n";
for (int i = 0; i < 1000000; i++) {
ren = (res + sin(i) + tan(i));
}
std::cout << "Thread " << tid << " Done......\n";
pthread_exit((void*)t);
}

int main(int argc, char* argv[]) {
pthread_t thread[4];
ptread_attr_t attr;
int rc = 0;
void* status = 0;

pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

for (int i = 0; i < 4; i++) {
std::cout << "Main:Thread " << i << " Creating......\n";
rc = pthread_create(&thread[i], &attr, BusyWork,
(void*)i);
if (rc) {
std::cout << "ERROR,return code from pthread_create() is " << rc << std::endl;
exit(-1);
}
}
pthread_attr_destory(&attr);

for (int i = 0; i < 4; i++) {
rc = pthreat_join(&thread[i], &status);
if (rc) {
std::cout << "ERROR:return code from pthread_join() is: " << rc << std::endl;
}
std::cout << "Main:Completed join with thread " << i << "having a status " << (long)status << std::endl;
}
std::cout << "Main,program completed. Exiting." << std::endl;
pthread_exit(0);
return 0;
}


Pthread_Join
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: