linux 多进程的同步和互斥,linux多线程编程——同步与互斥(一)

我们在前面文章中已经分析了多线程VS多进程,也分析了线程的使用,现在我们来讲解一下linux多线程编程之同步与互斥。

现在,我们不管究竟是多线程好还是多进程好,先讲解一下,为什么要使用多线程?

一、 为什么要用多线程技术?

1、避免阻塞,大家知道,单个进程只有一个主线程,当主线程阻塞的时候,整个进程也就阻塞了,无法再去做其它的一些功能了。

2、避免CPU空转,应用程序经常会涉及到RPC,数据库访问,磁盘IO等操作,这些操作的速度比CPU慢很多,而在等待这些响应时,CPU却不能去处理新的请求,导致这种单线程的应用程序性能很差。

3、提升效率,一个进程要独立拥有4GB的虚拟地址空间,而多个线程可以共享同一地址空间,线程的切换比进程的切换要快得多。

二、 如何使用多线程技术进行编程?

下面给出个多线程程序,一个最简单的模拟售票系统,代码如下:

#include

#include

void*ticketsell1(void*);

void*ticketsell2(void*);

inttickets = 20;

intmain()

{

pthread_t id1,id2;

interror;

error = pthread_create(&id1, NULL, ticketsell1, NULL);

if(error != 0)

{

printf("pthread is not created!\n");

return-1;

}

error = pthread_create(&id2, NULL, ticketsell2, NULL);

if(error != 0)

{

printf("pthread is not created!\n");

return-1;

}

pthread_join(id1,NULL);

pthread_join(id2,NULL);

return0;

}

void*ticketsell1(void*arg)

{

while(1)

{

if(tickets > 0)

{

// usleep(1000);

printf("ticketse1 sells ticket:%d\n",tickets--);

}

else

{

break;

}

}

return(void*)0;

}

void*ticketsell2(void*arg)

{

while(1)

{

if(tickets > 0)

{

// usleep(1000);

printf("ticketse2 sells ticket:%d\n",tickets--);

}

else

{

break;

}

}

return(void*)0;

}

执行结果如下:

fs@ubuntu:~/qiang/mthread$ ./mthread1

ticketse2 sells ticket:20

ticketse2 sells ticket:19

ticketse2 sells ticket:18

ticketse2 sells ticket:17

ticketse2 sells ticket:16

ticketse2 sells ticket:15

ticketse2 sells ticket:14

ticketse2 sells ticket:13

ticketse2 sells ticket:12

ticketse2 sells ticket:11

ticketse2 sells ticket:10

ticketse2 sells ticket:9

ticketse2 sells ticket:8

ticketse2 sells ticket:7

ticketse2 sells ticket:6

ticketse2 sells ticket:4

ticketse2 sells ticket:3

ticketse2 sells ticket:2

ticketse2 sells ticket:1

ticketse1 sells ticket:5

看到结果,我们发现时能正常卖票的,一部分连续是sel2,另一部分是ticketsel1;

此时,其实存在一个隐含的问题,就是线程间的切换,在单CPU系统中,CPU是有时间片时间,时间片到了,就要执行其它的线程,假设thread1执行到if里面,但在printf执行前发生了线程切换,那么会发生什么呢?我们在这里用usleep函数(放开程序中的usleep注释行)进行强制模拟切换;

我们看看结果:

fs@ubuntu:~/qiang/mthread$ gcc -o mthread1 mthread1.c -lpthread

fs@ubuntu:~/qiang/mthread$ ./mthread1

ticketse2 sells ticket:20

ticketse1 sells ticket:19

ticketse2 sells ticket:18

ticketse1 sells ticket:17

ticketse2 sells ticket:16

ticketse1 sells ticket:15

ticketse2 sells ticket:14

ticketse1 sells ticket:13

ticketse2 sells ticket:12

ticketse1 sells ticket:11

ticketse2 sells ticket:10

ticketse1 sells ticket:9

ticketse2 sells ticket:8

ticketse1 sells ticket:7

ticketse2 sells ticket:6

ticketse1 sells ticket:5

ticketse2 sells ticket:4

ticketse1 sells ticket:3

ticketse1 sells ticket:2

ticketse2 sells ticket:1

ticketse1 sells ticket:0

fs@ubuntu:~/qiang/mthread$

运行程序发现竟然有0号票被卖出了,这显然是错误的!当thread1的if里面发生线程切换时,thread2得到运行,把最后一张票卖了,此时thread1恢复运行,结果卖出了0号票,这里我们需要的是火车票的票数数据对于所有线程而言是同步的,所以就要用到线程同步技术了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值