我有一个测试pthread_create的基本程序:
int main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
long t;
for(t=0; t<NUM_THREADS; t++){
/* TODO assignment 3.2 a) */
pthread_create(&threads[t], NULL, SomeFunction, t);
// pthread_join(threads[t], NULL);
}
printf("Completed. Exiting\n");
pthread_exit(NULL);
}
每次我运行它时,它都会以随机顺序创建线程而不考虑for循环。这是什么原因?
答案 0 :(得分:2)
我认为你的意思是你看到SomeFunction
的结果(或某些副作用)不是严格按照t
的升序发生的。
根据定义,线程是异步执行的单元,其状态(执行与否)由OS确定。操作系统可以根据需要自由安排线程。除了不存在然后存在之外,您碰巧创建这些线程的顺序不是OS调度程序的“输入”。如果您需要以特定顺序在不同线程中执行某些操作,则必须使用信号量,互斥锁等同步原语手动同步这些线程。
简而言之,这只是“线程的工作方式”。我希望你看到以这种方式创建的线程的结果/副作用的顺序在t
方面是有效的非确定性的。