免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 10003 | 回复: 30
打印 上一主题 下一主题

一道面试题: 实现一个函数,对数组任两个元素实现交换,要求并发 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-08 14:22 |只看该作者 |倒序浏览
本帖最后由 gaoping561 于 2011-03-08 14:25 编辑

有一个数组a[1000], 写一个函数实现其任两个数据交换,要求并发。
比如a[1] 和 a[99] 交换的同时 a[2] 和 a[3] 也能同时交换而不冲突,但a[1]和和其他数据就不能交换了。
  1. void swap(int a[], int index1, int index2)
  2. {

  3. int tmp;

  4. down_interruptible(&sem);

  5. tmp = a[index1];
  6. a[index1]=a[index2];
  7. a[index2]=tmp;

  8. up(&sem);

  9. }
复制代码
这种实现显然是不行的,信号量锁住了整个数组,没有实现并发。问题是交换冲突的时候怎么处理?

求解答!

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2011-03-08 14:38 |只看该作者
我感觉有多少个元素就要多少个锁...而且还要小心死锁

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2011-03-08 15:05 |只看该作者
LZ 实际的需求是什么呢

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
4 [报告]
发表于 2011-03-08 15:14 |只看该作者
lz说了是面试题..

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2011-03-08 15:22 |只看该作者
晕。我还想呢,直接讨论内核里的实现

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
6 [报告]
发表于 2011-03-08 16:09 |只看该作者
为啥要发内核版......

论坛徽章:
0
7 [报告]
发表于 2011-03-08 16:23 |只看该作者
回复 6# tempname2


    这里人多啊,而且并发讨论也是和内核有关的话题吧

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
8 [报告]
发表于 2011-03-08 16:27 |只看该作者
大哥你07注册,难道不知道C版一向比内核版人多吗?那里一样可以讨论并发......

论坛徽章:
0
9 [报告]
发表于 2011-03-08 16:37 |只看该作者
这个貌似不需要用锁吧,直接用xchg()。
X86下可以直接使用xchgb/xchgw/xchgl指令原子性的实现交换。

论坛徽章:
0
10 [报告]
发表于 2011-03-08 17:04 |只看该作者
xchg必须有一个操作数是寄存器吧。
我的想法是使用以下结构。每一次锁的时候将a和b赋值。可以有几个锁,供不同的线程使用,每个线程只能申请一个锁。当申请锁的时候检查已经上锁的a,b是否是你想要操作的数。如果是的话,就等吧

struct{
  int a_vec;
  int b_vec
  sem
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP