免费注册 查看新帖 |

Chinaunix

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

关于线程阻塞 求教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-28 20:53 |只看该作者 |倒序浏览
关于线程阻塞问题,一个用户态线程如果被阻塞,那么整个进程都会阻塞,我在APUE中也看到是这样讲解的 谁能举个例子??


这个是我的测试代码


#define MAX_THREAD (3)


unsigned long long main_counter;
unsigned long long counter[MAX_THREAD] = {0};


void *thread_worker(void *i)
{
        int thread_num = *((int *)i);
        printf("my thread_num = %d\n", thread_num);
        while(1){
                counter[thread_num]++;
                main_counter++;
                sleep(1);
        }
}


int main(int argc, char ** argv)
{
        int         i;
        int         rtn;
        char        ch;
        pthread_t        pthread_id[MAX_THREAD] = {0};
        for( i = 0; i < MAX_THREAD; i++){
                if ( -1 == pthread_create(pthread_id + i, 0, thread_worker, (void *)(&i))){
                        printf("pthread_create error\n");
                }
        }
        do{
                unsigned long long sum = 0;
                for( i = 0; i < MAX_THREAD; i++){
                        sum += counter[i];
                        printf("%llu\n", counter[i]);
                }
                printf("%llu, %llu\n", main_counter, sum);
        }while((ch = getchar())!= 'q');
        return 0;
}


在main函数中的while 会产生阻塞, 但是线程thread_worker还在运行 因为每次随意按下一个不是q的键时打印的值不同 这怎么解释??
有不妥的地方请大家指教  谢谢!!!

论坛徽章:
0
2 [报告]
发表于 2011-03-29 22:26 |只看该作者
不会的,要是阻塞了那多线程还有什么意义呢?

论坛徽章:
0
3 [报告]
发表于 2011-03-30 09:46 |只看该作者
线程和进程的区别就是能够独立运行,因此任何一个线程的阻塞都不会也不应该引起别的线程的长期阻塞。
很有可能是资源竞争时导致死锁了,比如mutex一直lock住不释放。

论坛徽章:
0
4 [报告]
发表于 2011-03-31 12:48 |只看该作者
回复 1# losemyheaven


     看看用户态和内核态线程的区别

论坛徽章:
0
5 [报告]
发表于 2011-04-01 11:52 |只看该作者
本帖最后由 scienceworld 于 2011-04-01 11:54 编辑

1、如果你的进程不是单线程的,那么其中一个线程阻塞并不会阻塞整个进程。
2、LinuxThreads是用户空间的线程库,所采用的是线程-进程1对1模型(即一个用户线程对应一个轻量级进程,而一个轻量级进程对应一个特定的内核线程),所以用户线程阻塞也就意味着这个对应的内核轻量级进程的阻塞。

论坛徽章:
0
6 [报告]
发表于 2011-04-01 20:21 |只看该作者
线程是并发运行的,由内核进行调度,除非是单线程,否则单一线程阻塞是不会导致整个进程阻塞。内核会调度的。

论坛徽章:
7
IT运维版块每日发帖之星
日期:2016-05-27 06:20:00IT运维版块每日发帖之星
日期:2016-06-09 06:20:00操作系统版块每日发帖之星
日期:2016-06-12 06:20:00程序设计版块每日发帖之星
日期:2016-06-12 06:20:00操作系统版块每日发帖之星
日期:2016-06-13 06:20:00IT运维版块每日发帖之星
日期:2016-06-17 06:20:002015-2016NBA季后赛纪念章
日期:2016-06-28 17:42:27
7 [报告]
发表于 2011-04-03 22:16 |只看该作者
lock 函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP