首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-02-11 
出道题+送点分+混脸熟以下代码运行的结果是什么?为什么?//chance_to_see_99.cpp//g++-g-pthreadchance_to_

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

//   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 是不是一个原子操作?

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

热点排行