pthread系统调用
1. 创建线程
pthread_create(pthread_t *, const pthread_attr_t *, void *(*)(void *), void *)
参数说明
pthread_t * 表示线程ID,声明方式pthread_t tid;
const pthread_attr_t * 表示线程的参数,参考
void *(*)(void *)表示线程开始时执行的函数,如void fun(void*),也可使用类的静态函数
void* 为第三个参数所代表的函数的参数,即void* fun(void*)中第二个void*
返回值为0表示成功,其他为错误例:
#include <iostream>
#include <pthread.h>
#include <unistd.h> //sleep函数的头文件
void* callFunToPrintfA(void * args);
void* callFunToPrintfB(void * args);
int main(int argc, const char * argv[]) {
pthread_t tidToCallFunToPrintfA;
pthread_t tidToCallFunToPrintfB;
int i = pthread_create(&tidToCallFunToPrintfA, NULL, callFunToPrintfA, NULL);
int i2 = pthread_create(&tidToCallFunToPrintfB, NULL, callFunToPrintfB, NULL);
if(i!=0 || i2!=0){
printf("ERROR,ERROR CODE: %d,%d",i,i2);
}
pthread_exit( NULL );//等待线程结束后在结束进程
}
void* callFunToPrintfA(void * args){
while (1) {
printf("A");
sleep(1);
}
return NULL;
}
void* callFunToPrintfB(void * args){
while (1) {
printf("B");
sleep(1);
}
return NULL;
}
输出结果:
A
B
A
B
……
2.向线程传递参数
例
#include <iostream>
#include <pthread.h>
#include <unistd.h>
void* callFunToPrintfByArgs(void * args);
int main(int argc, const char * argv[]) {
int c[3];
pthread_t tidToCallFunToPrintfByArgs[3];
for (int i = 0; i<3; i++) {
c[i] = 'A'+i;//有时线程已经运行,但传递的参数尚未及时赋值,故先将参数保存到内存中再传递
int i2 = pthread_create(&tidToCallFunToPrintfByArgs[i], NULL, callFunToPrintfByArgs,(void*)&c[i]);
if(i2!=0){
printf("ERROR:%d",i2);
}
}
pthread_exit( NULL );//等待线程结束后在结束进程
}
void* callFunToPrintfByArgs(void * args){
while (1) {
auto d = *((char*)args);
printf("%c\n",d);
sleep(1);
}
return NULL;
}
输出(省略换行符)
CBA CBA CBA CBA CAB CBA CBA CBA CBA …….
输出混乱,无法确定先后顺序
3.结束线程
pthread_exit(void *);
描述:调用该函数即结束调用该函数的进程;
参数 :pthread_t : 线程标识符,即线程ID,标识唯一线程。
例:
#include <iostream>
#include <pthread.h>
#include <unistd.h>
pthread_t A;
void* PrintfThread(void* args);
int main(int argc, const char * argv[]) {
int i1 = pthread_create(&A, NULL, PrintfThread, NULL);
if(i1 != 0){
printf("ERROR:%d",i1);
}
pthread_exit( NULL );//等待线程结束后在结束进程
}
void* PrintfThread(void* args){
for(int i =1 ;i<=100;i++){
sleep(0.3);
printf("%d\n",i);
if (i>=50) {
pthread_exit(NULL);//如无此行代码则输出1-100
}
}
return NULL;
}
输出为1-50
pthread_exit(NULL)成功将线程结束。
4.线程阻塞
pthread_join(pthread_t, void **);
描述:调用pthread_join即等待参数中的线程结束后在执行其他线程
参数 :pthread_t: 线程标识符,即线程ID,标识唯一线程。
返回值 : 0代表成功。 失败,返回的则是错误号。
未使用阻塞
#include <iostream>
#include <pthread.h>
#include <unistd.h>
pthread_t A;
pthread_t B;
void* ThreadA(void* args);
void* ThreadB(void* args);
int main(int argc, const char * argv[]) {
int i1 = pthread_create(&A, NULL, ThreadA, NULL);
int i2 = pthread_create(&B, NULL, ThreadB, NULL);
if(i1 != 0){
printf("ERROR:%d,%d",i1,i2);
}
pthread_exit( NULL );//等待线程结束后在结束进程
}
void* ThreadA(void* args){
for(int i =1 ;i<=5;i++){
sleep(0.3);
printf("%d\n",i);
}
return NULL;
}
void* ThreadB(void* args){
for(int i =6 ;i<=10;i++){
sleep(0.3);
printf("%d\n",i);
}
return NULL;
}
输出
6
1
7
2
3
4
5
8
9
10
使用阻塞
#include <iostream>
#include <pthread.h>
#include <unistd.h>
pthread_t A;
pthread_t B;
void* ThreadA(void* args);
void* ThreadB(void* args);
int main(int argc, const char * argv[]) {
int i1 = pthread_create(&A, NULL, ThreadA, NULL);
pthread_join(A, NULL);//使用阻塞
int i2 = pthread_create(&B, NULL, ThreadB, NULL);
if(i1 != 0){
printf("ERROR:%d,%d",i1,i2);
}
pthread_exit( NULL );//等待线程结束后在结束进程
}
void* ThreadA(void* args){
for(int i =1 ;i<=5;i++){
sleep(0.3);
printf("%d\n",i);
}
return NULL;
}
void* ThreadB(void* args){
for(int i =6 ;i<=10;i++){
sleep(0.3);
printf("%d\n",i);
}
return NULL;
}
输出
1
2
3
4
5
6
7
8
9
10
调用pthread_join即等待参数中的线程结束后在执行其他线程
5.放弃争用
pthread_yield_np();
描述:调用即放弃本轮到该线程的执行时间
例:
#include <iostream>
#include <pthread.h>
#include <unistd.h>
pthread_t A;
pthread_t B;
int i;
void* ThreadA(void* args);
void* ThreadB(void* args);
int main(int argc, const char * argv[]) {
int i1 = pthread_create(&A, NULL, ThreadA, NULL);
int i2 = pthread_create(&B, NULL, ThreadB, NULL);
if(i1 != 0){
printf("ERROR:%d,%d",i1,i2);
}
pthread_exit( NULL );//等待线程结束后在结束进程
}
void* ThreadA(void* args){
for(i =1 ;i<=10;i++){
sleep(0.3);
printf("%d\n",i);
}
return NULL;
}
void* ThreadB(void* args){
while (i<=5) {
pthread_yield_np();//如果i<=5即放弃本轮争用
}
printf("ThreadBIsRunning\n");
return NULL;
}
输出
1
2
3
4
5
ThreadBIsRunning
6
7
8
9
10