你应该及彼编译器警告,如线程函数(或者更确切地说,是什么应该是线程函数)不返回任何东西.
这将导致未定义的行为,因为您没有传递指向checkDoc
函数的指针pthread_create
,您实际调用该checkDoc
函数,并使用返回的指针作为指向线程函数的指针.由于该checkDoc
函数实际上没有返回任何内容,因此您将有未定义的行为,并且很可能是崩溃.
简单的方案?不要调用该checkDoc
函数:
pthread_create (&tid[i], NULL, checkDoc, NULL) // ^^^^^^^^ // No longer calling the function
如果你声明函数返回一个值,你应该实际执行它.如果未使用返回的值,则返回NULL
.
另外,在C语言中声明一个没有任何形式参数的函数时,它与声明该函数接受任意类型的任意数量的参数是一回事.POSIX线程函数必须专门接受一个void *
参数.如果你不在线程函数中使用参数,那么就不要命名参数:
void * checkDoc (void *) { ... }
最后一点也对main
函数有影响,因为C规范明确指出main
函数应该接受两个参数(an int
和an char *[]
),或者是void
.如果你有一个不带任何参数的函数,你必须通过使用void
as参数明确说明.
您的代码还存在其他问题.就像你没有初始化你正确使用的结构.或者就像你在创建每个线程后立即等待条件变量一样,并且在你开始等待它之前没有发出条件变量的信号,那么你将永远等待,代码将不会继续到你实际调用的部分信令功能.
你应该及彼编译器警告,如线程函数(或者更确切地说,是什么应该是线程函数)不返回任何东西.
这将导致未定义的行为,因为您没有传递指向checkDoc
函数的指针pthread_create
,您实际调用该checkDoc
函数,并使用返回的指针作为指向线程函数的指针.由于该checkDoc
函数实际上没有返回任何内容,因此您将有未定义的行为,并且很可能是崩溃.
简单的方案?不要调用该checkDoc
函数:
pthread_create (&tid[i], NULL, checkDoc, NULL) // ^^^^^^^^ // No longer calling the function
如果你声明函数返回一个值,你应该实际执行它.如果未使用返回的值,则返回NULL
.
另外,在C语言中声明一个没有任何形式参数的函数时,它与声明该函数接受任意类型的任意数量的参数是一回事.POSIX线程函数必须专门接受一个void *
参数.如果你不在线程函数中使用参数,那么就不要命名参数:
void * checkDoc (void *) { ... }
最后一点也对main
函数有影响,因为C规范明确指出main
函数应该接受两个参数(an int
和an char *[]
),或者是void
.如果你有一个不带任何参数的函数,你必须通过使用void
as参数明确说明.
您的代码还存在其他问题.就像你没有初始化你正确使用的结构.或者就像你在创建每个线程后立即等待条件变量一样,并且在你开始等待它之前没有发出条件变量的信号,那么你将永远等待,代码将不会继续到你实际调用的部分信令功能.