我试图看看是否有可能避免线程在thread_create之后立即启动。所以,我遇到了pthread_delay_np,我尝试了这个例子:
#define _MULTI_THREADED
#include <stdio.h>
#include <time.h>
#include <pthread.h>
#define NTHREADS 5
void *threadfunc(void *parm)
{
int rc;
struct timespec ts = {0, 0};
/* 5 and 1/2 seconds */
ts.tv_sec = 5;
ts.tv_nsec = 500000000;
printf("Thread blocked\n");
rc = pthread_delay_np(&ts);
if (rc != 0) {
printf("pthread_delay_np() - return code %d\n", rc);
return (void*)&rc;
}
printf("Wait timed out!\n");
return NULL;
}
int main(int argc, char **argv)
{
int rc=0;
int i;
pthread_t threadid[NTHREADS];
void *status;
int fail=0;
printf("Enter Testcase - %s\n", argv[0]);
printf("Create %d threads\n", NTHREADS);
for(i=0; i<NTHREADS; ++i) {
rc = pthread_create(&threadid[i], NULL, threadfunc, NULL);
}
printf("Wait for threads and cleanup\n");
for (i=0; i<NTHREADS; ++i) {
rc = pthread_join(threadid[i], &status);
if (status != NULL) {
fail = 1;
}
}
if (fail) {
printf("At least one thread failed!\n");
return 1;
}
printf("Main completed\n");
return 0;
}
但我一直得到“错误:'pthread_delay_np'未在此范围内声明”。有人知道为什么吗?
另外,还有其他方法可以阻止线程在thread_create之后立即启动吗?与调度程序有什么关系?
提前谢谢!!
答案 0 :(得分:3)
它也适用于HP-UX,VMS和Tru64 UNIX。
pthread_delay_np()
起源于POSIX.1c标准的D4草案。 POSIX.1c D4的主要实现者是分布式计算环境(DCE)的OSF。后缀_np表示API是不可移植的,不能依赖于另一个平台上的API。通常nanosleep()
是您想要用作替代品的。
答案 1 :(得分:2)
只需使用nanosleep(2)
。
答案 2 :(得分:1)
pthread_delay_np
似乎是非标准的,非便携式(因此为“_np”后缀)功能。您确定它适用于您的平台吗?
答案 3 :(得分:1)
您可以使用信号量向线程指示它可以通过信号量等待点开始执行。
答案可能取决于你试图通过避免线程立即启动来实现的目标。
修改强>
但是,我非常确定固定延迟不您实际需要的内容,除非您正在与环境(例如硬件)进行交互或仅进行实验。