读书人

出道题+送点分+混脸熟解决办法

发布时间: 2012-02-11 09:51:35 作者: rapoo

出道题+送点分+混脸熟
以下代码运行的结果是什么?为什么?

// 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;
}


[解决办法]
先MARK
再学习
[解决办法]
global_sum: 100
[解决办法]
从.cpp文件名看会出现99,没玩过linux/unix系列的东东
[解决办法]
global_sum <100
[解决办法]
同意ls,结果应该是不确定值
[解决办法]
99
[解决办法]
jf~~ welcome
[解决办法]
jjjjffff ~~
[解决办法]
接分的~~~~~~~~~~~`
[解决办法]
特地跑来接分
[解决办法]
这次答题.
--
既然join了, 没有create和join失败的话,
应该是100.
[解决办法]
学习..
[解决办法]


接分
[解决办法]
JF
[解决办法]
学习了
[解决办法]
#include <pthread.h>
干什么的?
[解决办法]
jf
[解决办法]
JF,楼上好啊
[解决办法]
:P
--既然join了, 没有create和join失败的话,
--应该是100.

[解决办法]
来接个分
[解决办法]
没玩过linux,只玩过Windows
接分
[解决办法]
接分
[解决办法]
实践真知

[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

[解决办法]
多次运行 结果 100
另外 系统为 Linux Enterprise Server 5

[解决办法]
当然 问题的关键不是这个结果
而是

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

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


所以如果该题如果为面试题目
结果应该是
<=100
[解决办法]
专业接分员!
[解决办法]
学习
[解决办法]
学习。。。
那个void *increment_fn(void *arg)
什么时候会处理失败?
什么时候会出现意外错误?
[解决办法]
其实函数
void *increment_fn(void *arg)
只是一个例子
实际在开发prj的时候,肯定要复杂的多的算法逻辑
所以是容易处理失败,或者意外错误的

而本例中的发生错误的概率是比较小的
[解决办法]
JF
[解决办法]
JF

[解决办法]
jf
[解决办法]
mark
[解决办法]
创建了100个线程 结果应该是100吧
线程之间是共享存储空间的
[解决办法]
to yutaooo:

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

不过我的偏向是一个更加宽泛的解析
当业务逻辑复杂的时候
该业务逻辑会出现很多造成失败的原因

[解决办法]
jf
[解决办法]
接分来啦
------解决方案--------------------


线程操作不出错显然100
[解决办法]
huzhangyou 的答案是正确的: <= 100
解释还不够完整.

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

这么夸张,能不能问下什么是原子操作?

读书人网 >C语言

热点推荐