出道题+送点分+混脸熟

yutaooo 2007-09-07 03:08:12
以下代码运行的结果是什么?为什么?

// chance_to_see_99.cpp
// g++ -g -pthread chance_to_see_99.cpp -lpthread -o chance_to_see_99

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

const int number_of_threads = 100;

int global_sum = 0;

void *increment_fn(void *arg) {
++global_sum;
return (void *)0;
}

int main() {
pthread_t thread_ids[number_of_threads] = { 0 };
for (int index = 0; index != number_of_threads; ++index) {
int create_thread_result = pthread_create(
&thread_ids[index], NULL, increment_fn, NULL);
if (create_thread_result != 0) {
printf("create thread fail. index: %d\n", index);
return EXIT_FAILURE;
}
}

for (int index = 0; index != number_of_threads; ++index) {
int join_thread_result = pthread_join(
thread_ids[index], NULL);
if (join_thread_result != 0) {
printf("join thread fail. index: %d\n", index);
return EXIT_FAILURE;
}
}

printf("global_sum: %d\n", global_sum);

return EXIT_SUCCESS;
}
...全文
695 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoshengwen1983 2007-12-09
  • 打赏
  • 举报
回复
看不懂哦
firefox_zhou 2007-09-10
  • 打赏
  • 举报
回复
huzhangyou 的答案是正确的: <= 100
解释还不够完整.

问题在于 ++global_sum 是不是一个原子操作?

这么夸张,能不能问下什么是原子操作?
shu_yoyo 2007-09-09
  • 打赏
  • 举报
回复
jf
huzhangyou 2007-09-09
  • 打赏
  • 举报
回复
to yutaooo:

>>问题在于 ++global_sum 是不是一个原子操作?
这句话说的太专业了 o(∩_∩)o...

不过我的偏向是一个更加宽泛的解析
当业务逻辑复杂的时候
该业务逻辑会出现很多造成失败的原因
yangliu817 2007-09-09
  • 打赏
  • 举报
回复
创建了100个线程 结果应该是100吧
线程之间是共享存储空间的
jun_yang5i5j 2007-09-09
  • 打赏
  • 举报
回复
线程操作不出错显然100
gs0038 2007-09-09
  • 打赏
  • 举报
回复
接分来啦
makewater 2007-09-08
  • 打赏
  • 举报
回复
jf
blueink_200451 2007-09-08
  • 打赏
  • 举报
回复
JF
ice_bird 2007-09-08
  • 打赏
  • 举报
回复
JF
huzhangyou 2007-09-08
  • 打赏
  • 举报
回复
其实函数
void *increment_fn(void *arg)
只是一个例子
实际在开发prj的时候,肯定要复杂的多的算法逻辑
所以是容易处理失败,或者意外错误的

而本例中的发生错误的概率是比较小的
purewinter 2007-09-08
  • 打赏
  • 举报
回复
学习。。。
那个void *increment_fn(void *arg)
什么时候会处理失败?
什么时候会出现意外错误?
lei001 2007-09-08
  • 打赏
  • 举报
回复
学习
Forkerl 2007-09-08
  • 打赏
  • 举报
回复
专业接分员!
huzhangyou 2007-09-08
  • 打赏
  • 举报
回复
当然 问题的关键不是这个结果
而是

void *increment_fn(void *arg) {
++global_sum;
return (void *)0;
}
功能的逻辑问题

当这个算法可能处理失败,或者执行该函数出现意外错误结束的时候
会出现<100的情况


所以如果该题如果为面试题目
结果应该是
<=100
huzhangyou 2007-09-08
  • 打赏
  • 举报
回复
多次运行 结果 100
另外 系统为 Linux Enterprise Server 5
huzhangyou 2007-09-08
  • 打赏
  • 举报
回复
实践真知

[root@localhost ~]# g++ -g -pthread c99.cpp -lpthread -o c99
[root@localhost ~]# ./c99
global_sum: 100
[root@localhost ~]# ./c99
global_sum: 100
[root@localhost ~]# ./c99
global_sum: 100
[root@localhost ~]# ./c99
global_sum: 100
[root@localhost ~]# ./c99
global_sum: 100
[root@localhost ~]# ./c99
global_sum: 100
yutaooo 2007-09-08
  • 打赏
  • 举报
回复
huzhangyou 的答案是正确的: <= 100
解释还不够完整.

问题在于 ++global_sum 是不是一个原子操作?
fanerde 2007-09-08
  • 打赏
  • 举报
回复
mark
ReverseEngineering 2007-09-07
  • 打赏
  • 举报
回复
接分
加载更多回复(21)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧