Linux运行phread,pthread_create(Linux下的C语言多线程)

{

printf(“ thread2: number =%d \ n”,number);

pthread_mutex_lock(&mut);

number ++;

pthread_mutex_unlock(&mut);

sleep(3);

}

printf(“ thread2: 主要功能是否在等待我完成任务?\ n”);

pthread_exit(NULL);

}

void thread_create(void)

{

int temp;

memset(&thread,0,sizeof(thread)); //注释1

/ *创建线程* /

if((temp = pthread_create(&thread [0],NULL,

thread1,NULL))!= 0)//注释2

printf(“线程1创建失败!\ n”);

其他

printf(“创建线程1 \ n”);

if((temp = pthread_create(&thread [1],NULL,

thread2,NULL))!= 0)//注释3

printf(“线程2创建失败”);

9YGEhY8fkISw3hfPpivZI472LogfvPpSp2VuX34BEEBbCpOxbSQqZFeWOJrN9CT9NfGYFQ6Um8VuWkMrjQc.jpg

其他

printf(“创建线程2 \ n”);

}

void thread_wait(void)

{

/ *等待线程结束* /

if(thread [0]!= 0){//评论4

pthread_join(thread [0],NULL);

printf(“线程1已经结束\ n”);

}

if(thread [1]!= 0){// comment5

pthread_join(thread [1],NULL);

printf(“线程2已结束\ n”);

}

}

int main()

{

/ *使用默认属性启动互斥锁* /

pthread_mutex_init(&mut,NULL);

printf(“我是主要功能,我正在创建线程,呵呵”);

thread_create();

printf(“我是主要功能,我正在等待线程完成任务,呵呵”);

thread_wait();

返回0;

}

让我们先编译并执行

报价:

falcon @ falcon: 〜/ program / c / code / ftp $ gcc -lpthread -othread_example thread_example.c

falcon @ falcon: 〜/ program / c / code / ftp $ ./thread_example

e0a419fa0e245920614e65da9e4ed76f.png

我是主要功能,我正在创建一个线程,呵呵

线程1已创建

创建线程2

我是主要功能,我正在等待线程完成任务,呵呵

线程1: 我是线程1

线程1: 数字= 0

线程2: 我是线程2

线程2: 数字= 1

线程1: 数字= 2

thread2: 数字= 3

线程1: 数字= 4

线程2: 数字= 5

线程1: 数字= 6

线程1: 数字= 7

线程2: 数字= 8

线程1: 数字= 9

thread2: 数字= 10

线程1: 主要功能正在等待我完成任务吗?

线程1已经结束

thread2: 主要功能正在等待我完成任务吗?

线程2已结束

示例代码中的注释应该更清楚. 让我引用互联网上上面提到的一些函数和变量.

报价:

与线程相关的操作

一个pthread_t

pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:

typedef unsigned long int pthread_t;

它是一个线程标识符.

两个pthread_create

6b08187e39d99c9b180c2c98883a5b04.png

函数pthread_create用于创建线程,其原型为:

extern int pthread_create __P((pthread_t * __ thread,__ const pthread_attr_t * __ attr,

无效*(* __ start_routine)(无效*),无效* __ arg));

第一个参数是指向线程标识符的指针,第二个参数用于设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数. 在这里,我们的函数线程不需要任何参数,因此最后一个参数设置为空指针. 我们还将第二个参数设置为空指针,这将生成具有默认属性的线程. 在下一节中,我们将详细介绍线程属性的设置和修改. 成功创建线程后c同时启动多个pthread,该函数返回0. 如果不为0,则意味着线程创建失败. 常见的错误返回码是EAGAIN和EINVAL. 前者表示系统限制了新线程的创建,例如,线程数太大;后者表示第二个参数表示的线程属性值是非法的. 成功创建线程后,新创建的线程将运行由参数三和参数四确定的功能,而原始线程将继续运行下一行代码.

三个pthread_join pthread_exit

函数pthread_join用于等待线程结束. 函数原型为:

extern int pthread_join __P((pthread_t __th,void ** __ thread_return));

第一个参数是等待线程的标识符,第二个参数是用户定义的指针,可用于存储等待线程的返回值. 该功能是线程阻塞功能. 调用它的函数将等待,直到等待线程结束. 当函数返回时,将恢复等待线程的资源. 结束线程有两种方法. 一个是,就像上面的示例一样,函数结束,并且调用它的线程结束. 另一种方法是通过函数pthread_exit. 其功能原型为:

extern void pthread_exit __P((void * __ retval))__ attribute__((__noreturn __));

唯一的参数是函数的返回码. 只要pthread_join中的第二个参数thread_return不为NULL,该值就会传递给thread_return. 最后要注意的是,一个线程不能由多个线程等待,否则,第一个接收到该信号的线程将成功返回,而其余调用pthread_join的线程将返回错误代码ESRCH.

在本节中,我们编写了最简单的线程,并掌握了三个最常用的函数pthread_create,pthread_join和pthread_exit. 接下来,让我们了解线程的一些常见属性以及如何设置这些属性.

与互斥锁有关

互斥锁用于确保一段时间内只有一个线程正在执行一段代码.

一个pthread_mutex_init

函数pthread_mutex_init用于生成互斥量. NULL参数指示使用默认属性. 如果需要声明特定的属性互斥锁,则必须调用函数pthread_mutexattr_init. 函数pthread_mutexattr_setpshared和函数pthread_mutexattr_settype用于设置互斥锁的属性. 上一个函数设置属性pshared,该属性具有两个值PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED. 前者用于同步不同进程中的线程,后者用于同步进程中的不同线程. 在上面的示例中,我们使用了默认属性PTHREAD_PROCESS _

PRIVATE. 后者用于设置互斥锁的类型,可选类型为PTHREAD_MUTEX_NORMAL,PTHREAD_MUTEX_ERRORCHECK,PTHREAD_MUTEX_RECURSIVE和PTHREAD

_MUTEX_DEFAULT. 它们分别定义了不同的访问和解锁机制. 通常,最后一个默认属性是选中的.

两个pthread_mutex_lock pthread_mutex_unlockpthread_delay_np

pthread_mutex_lock语句开始使用互斥锁进行锁定. 之后,代码被锁定,直到调用pthread_mutex_unlock,即一次只能由一个线程调用和执行. 当一个线程执行到pthread_mutex_lock时,如果此时该锁被另一个线程使用,则该线程被阻塞,即程序将等待,直到另一个线程释放该互斥锁.

注意:

1应该注意的是,以上两个睡眠不仅用于演示目的,而且还使线程休眠一段时间,让线程释放互斥量,并等待另一个线程使用该锁. 下面的参考文献1说明了该问题. 但是,在Linux下似乎没有pthread_delay_np函数(我尝试过,建议没有定义该函数的引用),所以我改用sleep,但是参考2提供了另一种方法,它似乎被pthread_cond_timedwait代替了,其中提供了一种方法来实现它.

2请注意注释1-5,这是我花了几个小时才发现的问题.

如果没有comment1c同时启动多个pthread,comment4和comment5,则它将在pthread_join期间导致段错误. 另外,上面的comment2和comment3是根本原因,因此请记住编写完整的代码. 因为上面的线程可能无法成功创建,所以使用pthread_join时不可能等到下面的线程结束以及段错误(访问未知内存区域). 另外,在使用内存集时,您需要包含string.h头文件

参考:

1. Linux下的多线程编程

2. pthread_delay_np(这是posix条件变量的示例)

3. pthread_join和segfault(非常感谢您在这里,不要错过)

4. posix线程编程指南[学习linux下的多线程,如果不阅读,将后悔]

; Board = program&Number = 294073&page = 0&view = collapsed&sb = 5&o = 7&fpart =

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-257275-1.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值