pthread线程使用范例

使用pthread线程库时,应该包含头文件pthread.h

#include <pthread.h>

编译时需要加上 -lpthread链接该库

创建线程使用接口

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

第一个参数tidp为类型为pthread_t的指针,代表线程的tid

第二个参数attr为设置线程属性的结构体pthread_attr指针,不需要设置可以置为NULL

第三个参数start_rtn为void* (void*) 类型的函数指针,就是线程的入口函数了

第四个参数restrict_arg为线程入口带的参数,因为是(void*)所以通过类型强制转换可以是任何参数

类似这样:

void *routine1(void *arg)//线程入口函数
{
    int* para=(int*) arg;//强制转换参数,这里假设传的是一个整数
    printf("para=%d",*para);
    while(1)
	sleep(1);

}

创建多条线程时,对共享资源的使用时,需要用锁加以限制,这里推荐使用pthread库的读写锁,使用也非常简单:

pthread_rwlock_t rwlock;//定义一个读写锁,一般定义为全局变量

global num = 0;

func()
{
    int i;

    pthread_rwlock_init(&rwlock, NULL);//读写锁初始化

    pthread_rwlock_rdlock(&rwlock);//加读锁
    num==0?i=1:i=0;//读取共享资源
    pthread_rwlock_unlock(&rwlock);//解读锁

    pthread_rwlock_wrlock(&rwlock);//加写锁
    num++;//写共享资源
    pthread_rwlock_unlock(&rwlock);//解写锁

    pthread_rwlock_unlock(&rwlock);//不用时记得销毁
}

 

完整的简单使用范例如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>

#include <errno.h>
#include <pthread.h>

pthread_rwlock_t rwlock;

int global = 0;

void *routine1(void *arg)
{

	//============ WRITE lock ============//
	pthread_rwlock_wrlock(&rwlock);
	global += 1;
	printf("I am %s, now global=%d\n", (char *)arg, global);
	sleep(1);
	pthread_rwlock_unlock(&rwlock);
	//=========== WRITE unlock ===========//

	pthread_exit(NULL);
}

void *routine2(void *arg)
{
	//============ WRITE lock ============//
	pthread_rwlock_wrlock(&rwlock);
	global  = 100;
	printf("I am %s, now global=%d\n", (char *)arg, global);
	sleep(1);
	pthread_rwlock_unlock(&rwlock);
	//=========== WRITE unlock ===========//

	pthread_exit(NULL);
}

void *routine3(void *arg)
{
	//============ READ lock ============//
	pthread_rwlock_rdlock(&rwlock);
	printf("I am %s, now global=%d\n", (char *)arg, global);
	sleep(1);
	pthread_rwlock_unlock(&rwlock);
	//=========== READ unlock ===========//

	pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
	pthread_rwlock_init(&rwlock, NULL);

	pthread_t t1, t2, t3;
	
	pthread_create(&t1, NULL, routine1, "thread 1");
	pthread_create(&t2, NULL, routine2, "thread 2");
	pthread_create(&t3, NULL, routine3, "thread 3");
		
	pthread_join(t1, NULL);
	pthread_join(t2, NULL);
	pthread_join(t3, NULL);
	
	pthread_rwlock_destroy(&rwlock);
	
	return 0;
}

其中,

pthread_exit(NULL);为线程退出的函数,可以带上自己想返回给主线程的参数,如:

pthread_exit("thread1 exit!"); 

在主线程使用 pthread_join() 来接合子线程获取返回的参数,如:

    void *dead_str;
    pthread_join(tid1, &dead_str);
    printf("%s",(char*) dead_str);//假设返回的是字符串

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值