关于线程阻塞 求教
关于线程阻塞问题,一个用户态线程如果被阻塞,那么整个进程都会阻塞,我在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的键时打印的值不同 这怎么解释??
有不妥的地方请大家指教 谢谢!!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
不会的,要是阻塞了那多线程还有什么意义呢?
线程和进程的区别就是能够独立运行,因此任何一个线程的阻塞都不会也不应该引起别的线程的长期阻塞。
很有可能是资源竞争时导致死锁了,比如mutex一直lock住不释放。
回复 1# losemyheaven
看看用户态和内核态线程的区别
本帖最后由 scienceworld 于 2011-04-01 11:54 编辑
1、如果你的进程不是单线程的,那么其中一个线程阻塞并不会阻塞整个进程。
2、LinuxThreads是用户空间的线程库,所采用的是线程-进程1对1模型(即一个用户线程对应一个轻量级进程,而一个轻量级进程对应一个特定的内核线程),所以用户线程阻塞也就意味着这个对应的内核轻量级进程的阻塞。
线程是并发运行的,由内核进行调度,除非是单线程,否则单一线程阻塞是不会导致整个进程阻塞。内核会调度的。
lock 函数