1.线程概述
线程是一个进程内的基本调度单位,也可以称为轻量级进程。线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。因此,大大减少了上下文切换的开销。一个进程可以有多个线程,也就
是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间。
2.线程实现
线程创建pthread_create()
所需头文件#include
<pthread.h>
函数原型int
pthread_create
((pthread_t
*thread,
pthread_attr_t
*attr,
thread:线程标识符
attr:线程属性设置
start_routine:线程函数的起始地址
arg:传递给start_routine的参数
函数返回值
成功:0
出错:-1
线程退出pthread_exit()
所需头文件#include
<pthread.h>
函数原型void
pthread_exit(void
*retval)
函数传入值retval:pthread_exit()调用者线程的返回值,可由其他函数如pthread_join
来检索获取
等待线程退出并释放资源pthread_join()
所需头文件#include
<pthread.h>
函数原型int
pthread_join
((pthread_t
th,
void
**thread_return))
函数传入值
th:等待线程的标识符
thread_return:用户定义的指针,用来存储被等待线程的返回值(不为NULL时)
函数返回值
成功:0
出错:-1
代码举例
1.
#include<pthread.h>
2.
#include<stdio.h>
3.
#include<errno.h>
4.
5.
/*线程1*/
6.
void
thread1()
7.
{
8.
int
i=0
9.
10.
while(1)
11.
{
12.
printf(thread1:%d/n,i)
13.
if(i>3)
14.
pthread_exit(0)
15.
i++
16.
sleep(1)
17.
}
18.
}
19.
20.
/*线程2*/
21.
void
thread2()
22.
{
23.
int
i=0
24.
25.
while(1)
26.
{
27.
printf(thread2:%d/n,i)
28.
if(i>5)
29.
pthread_exit(0)
30.
i++
31.
sleep(1)
32.
}
33.
}
34.
35.
int
main()
36.
{
37.
pthread_t
t1,t2
38.
39.
/*创建线程*/
40.
pthread_create(&t1,NULL,(void
*)thread1,NULL)
41.
pthread_create(&t2,NULL,(void
*)thread2,NULL)
42.
/*等待线程退出*/
43.
pthread_join(t1,NULL)
44.
pthread_join(t2,NULL)
45.
return
0
46.
}
3同步与互斥
<1>互斥锁
互斥锁的 *** 作主要包括以下几个步骤。
•
互斥锁初始化:pthread_mutex_init
•
互斥锁上锁:pthread_mutex_lock
•
互斥锁判断上锁:pthread_mutex_trylock
•
互斥锁接锁:pthread_mutex_unlock
•
消除互斥锁:pthread_mutex_destroy
1.
#include<pthread.h>
2.
#include<stdio.h>
3.
#include<errno.h>
4.
5.
int
i=0/*共享变量*/
6.
pthread_mutex_t
mutex=PTHREAD_MUTEX_INITIALIZER/*互斥锁*/
7.
8.
void
thread1()
9.
{
10.
int
ret
11.
while(1)
12.
{
13.
14.
15.
ret=pthread_mutex_trylock(&mutex)/*判断上锁*/
16.
17.
if(ret!=EBUSY)
18.
{
19.
pthread_mutex_lock(&mutex)/*上锁*/
20.
printf(This
is
thread1:%d/n,i)
21.
i++
22.
pthread_mutex_unlock(&mutex)/*解锁*/
23.
}
24.
sleep(1)
25.
}
26.
}
27.
28.
void
thread2()
29.
{int
ret
30.
while(1)
31.
{
32.
33.
ret=pthread_mutex_trylock(&mutex)
34.
if(ret!=EBUSY)
35.
{
36.
pthread_mutex_lock(&mutex)
37.
printf(This
is
thread2:%d/n,i)
38.
i++
39.
pthread_mutex_unlock(&mutex)
40.
}
41.
sleep(1)
42.
}
43.
}
44.
int
main()
45.
{
46.
pthread_t
t1,t2
47.
pthread_mutex_init(&mutex,NULL)
48.
pthread_create(&t1,NULL,(void
*)thread1,NULL)
49.
pthread_create(&t2,NULL,(void
*)thread2,NULL)
50.
51.
pthread_join(t1,NULL)
52.
pthread_join(t2,NULL)
53.
54.
pthread_mutex_destroy(&mutex)
55.
return
0
56.
}
<2>信号量
未进行同步处理的两个线程
1.
#include<pthread.h>
2.
#include<stdio.h>
3.
#include<errno.h>
4.
5.
int
i=0
6.
void
thread1()
7.
{
8.
9.
while(1)
10.
{
11.
printf(This
is
thread1:%d/n,i)
12.
i++
13.
sleep(1)
14.
}
15.
}
16.
17.
18.
void
thread2()
19.
{
20.
21.
while(1)
22.
{
23.
printf(This
is
thread2:%d/n,i)
24.
i++
25.
sleep(1)
26.
}
27.
}
28.
29.
int
main()
30.
{
31.
pthread_t
t1,t2
32.
33.
pthread_create(&t1,NULL,(void
*)thread1,NULL)
34.
pthread_create(&t2,NULL,(void
*)thread2,NULL)
glibc是linux下的libc库,你安装这个库之后,会将发布的头文件拷贝到 /usr/include下,而库文件被拷贝到/lib或者/usr/lib下,你在应用时,需要指定头文件路径以及库的路径;当然/usr/include和/lib、/usr/lib是系统的默认路径;源码可以从glibc的官网下载到(http://www.gnu.org/software/libc/)
Linux下的sleep函数 要用的话得需要#include <unistd.h>
sleep把进程的运行状态改为睡眠,将其从系统可执行队列去掉,这样系统就不会调度到该进程,不会分配CPU时间片,同时根据该进程的睡眠时间,将进程挂入相应的定时器队列中。
同时内核维持一个定时器队列,每一次时钟中断处理,都把当前到期的队列中的进程唤醒,加入到可运行进程队列中。 同时对所有挂入定时器队列中的进程时间值减1。
参考代码:
#include<stdio.h>
#include<unistd.h>
int main()
{
int sec=0,
usec=0
while(1)
{
printf("sec = %d \n",++sec)
sleep(1)
printf("usec = %d \n",++usec)
usleep(1000000)
}
return 0
}
扩展资料:
在Linux下,sleep中的“s”不大写
sleep()单位为秒,usleep()里面的单位是微秒。在内核中,sleep的实现是由pause函数和alarm函数两个实现的。
特别注意在Codeblocks环境下是无法使用sleep函数的,因为在windows上Codeblocks采用mingw(Gnu在Window环境下的编译器,可以充分使用WindowsApi)作为编译器,而在stdlib.h中sleep的说明如下:_CRTIMP void __cdecl __MINGW_NOTHROW _sleep (unsigned long) __MINGW_ATTRIB_DEPRECATED可以认为mingw舍弃了sleep函数,建议用Sleep实现sleep。
参考资料来源:百度百科-Sleep函数
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)