当前位置:  开发笔记 > 编程语言 > 正文

分段故障线程(监视器)

如何解决《分段故障线程(监视器)》经验,为你挑选了1个好方法。

你应该及彼编译器警告,如线程函数(或者更确切地说,是什么应该是线程函数)不返回任何东西.

这将导致未定义的行为,因为您没有传递指向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.如果你有一个不带任何参数的函数,你必须通过使用voidas参数明确说明.


您的代码还存在其他问题.就像你没有初始化你正确使用的结构.或者就像你在创建每个线程立即等待条件变量一样,并且你开始等待它之前没有发出条件变量的信号,那么你将永远等待,代码将不会继续到你实际调用的部分信令功能.



1> Some program..:

你应该及彼编译器警告,如线程函数(或者更确切地说,是什么应该是线程函数)不返回任何东西.

这将导致未定义的行为,因为您没有传递指向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.如果你有一个不带任何参数的函数,你必须通过使用voidas参数明确说明.


您的代码还存在其他问题.就像你没有初始化你正确使用的结构.或者就像你在创建每个线程立即等待条件变量一样,并且你开始等待它之前没有发出条件变量的信号,那么你将永远等待,代码将不会继续到你实际调用的部分信令功能.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有