这可能是一个简单的问题,但我找不到明确的答案。我在 c 代码中有多个线程,其中一个使用 select 等待 n 秒。我的问题是它会阻塞整个进程 n 秒(如 usleep)还是 select 只阻塞调用线程(更像 nanosleep)。感谢您的回答。
问问题
393 次
3 回答
4
我见过几个实现,其中一个线程阻塞,select
而其他线程继续处理 - 所以,是的,它只阻塞正在运行的线程。
(抱歉没有提供任何参考资料)
于 2010-07-13T21:03:39.643 回答
1
是的。一个草率但仍然相当确凿的测试。
#include <iostream>
#include <pthread.h>
#include <sys/time.h>
using namespace std;
pthread_mutex_t cout_mutex = PTHREAD_MUTEX_INITIALIZER;
void *task1(void *X)
{
timeval t = {0, 100000};
for (int i = 0; i < 10; ++i)
{
pthread_mutex_lock(&cout_mutex);
cout << "Thread A going to sleep" << endl;
pthread_mutex_unlock(&cout_mutex);
select(0, NULL, NULL, NULL, &t);
pthread_mutex_lock(&cout_mutex);
cout << "Thread A awake" << endl;
pthread_mutex_unlock(&cout_mutex);
}
return (NULL);
}
void *task2(void *X)
{
pthread_mutex_lock(&cout_mutex);
cout << "Thread B down for the long sleep" << endl;
pthread_mutex_unlock(&cout_mutex);
timeval t = {5, 0};
select(0, NULL, NULL, NULL, &t);
pthread_mutex_lock(&cout_mutex);
cout << "Thread B glad to be awake" << endl;
pthread_mutex_unlock(&cout_mutex);
return (NULL);
}
int main(int argc, char *argv[])
{
pthread_t ThreadA,ThreadB;
pthread_create(&ThreadA,NULL,task1,NULL);
pthread_create(&ThreadB,NULL,task2,NULL);
pthread_join(ThreadA,NULL);
pthread_join(ThreadB,NULL);
return (0);
}
于 2010-07-14T04:11:01.647 回答
1
POSIX 规范select
仅在一个地方特别提到了“线程”,它谈到通过pselect()
.
与其他答案一样,我的经验也表明答案是肯定的,它只会阻塞调用线程。
于 2010-07-14T00:00:41.450 回答