|
|
发表于 2007-4-19 09:23:17
|
显示全部楼层
Post by waq
据说当一个线程阻塞一个事件的时候,其他线程应得不到这个事件。如果这时线程sleep了,也有可能导致其他线程sleep吧。个人理解,未经实践
谢谢这位兄台:)
我试过一下,似乎是只sleep当前线程。可能是因为当初libc是以进程的方式来实现线程的
关系吧
kernel是2.4.16,gcc是3.4.2
测试程序如下,只是一个很简单的程序,不知道能不能说明问题。
- #include <pthread.h>
- #include <stdio.h>
- #include <time.h>
- #define NUM_THREADS 5
- void *PrintHello(void *threadid)
- {
- printf("\n%d: Hello World sleeping now!\n", threadid);
- sleep(10);
- printf("\n%d: Hello World back!\n", threadid);
- pthread_exit(NULL);
- }
- int main (int argc, char *argv[])
- {
- pthread_t threads[NUM_THREADS];
- int rc, t;
- for(t=0; t<NUM_THREADS; t++){
- printf("Creating thread %d\n", t);
- rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
- if (rc){
- printf("ERROR; return code from pthread_create() is %d\n", rc);
- exit(-1);
- }
- }
- pthread_exit(NULL);
- }
复制代码
执行结果如下
- /bin> thread_sleep
- Creating thread 0
- 0: Hello World sleeping now!
- Creating thread 1
- 1: Hello World sleeping now!
- Creating thread 2
- 2: Hello World sleeping now!
- Creating thread 3
- 3: Hello World sleeping now!
- Creating thread 4
- 4: Hello World sleeping now!
- 0: Hello World back!
- 1: Hello World back!
- 2: Hello World back!
- 3: Hello World back!
- 4: Hello World back!
复制代码
上面的顺序说明不了什么问题,但是执行的时候当第一个线程sleep的时候第二个线程还在执行,而如果
是sleep整个进程的话,至少应该延迟10s才能够继续,而这里没有等待
所以当时判断不是sleep了整个进程。
如果这个方法可以的话,不知道有没有办法判断yield是yeild当前线程还是yield整个进程?
另外早期线程当中sleep不安全,后来的sleep实现都改过了。都是sleep线程的。 |
|