pthread_create创建线程后 errno为2
时间: 2023-11-15 17:59:00 浏览: 278
根据提供的引用内容,pthread_create()函数创建线程后 errno为2表示传递给函数的attr参数无效。attr参数是一个指向线程属性结构体的指针,如果该参数无效,则会返回错误码2。建议检查传递给pthread_create()函数的attr参数是否正确。如果attr参数为NULL,则使用默认线程属性。如果attr参数不为NULL,则必须使用pthread_attr_init()函数初始化线程属性结构体。如果仍然无法解决问题,可以查看系统的错误日志以获取更多信息。
相关问题
int main(int argc, char ** argv) { //线程调度相关 struct sched_param svparam = { .sched_priority = 71 }; pthread_attr_t svattr; sigset_t set; int sig; sigemptyset( & set); sigaddset( & set, SIGINT); sigaddset( & set, SIGTERM); sigaddset( & set, SIGHUP); pthread_sigmask(SIG_BLOCK, & set, NULL); pthread_attr_init( & svattr); pthread_attr_setdetachstate( & svattr, PTHREAD_CREATE_JOINABLE); pthread_attr_setinheritsched( & svattr, PTHREAD_EXPLICIT_SCHED); pthread_attr_setschedpolicy( & svattr, SCHED_FIFO); pthread_attr_setschedparam( & svattr, & svparam); errno = pthread_create( & svtid, & svattr, & server, NULL); if (errno) fail("pthread_create"); sigwait( & set, & sig); pthread_cancel(svtid); pthread_join(svtid, NULL); return 0; } 以上代码汇总sigwait函数的作用以及set的作用
以上代码中,`sigwait()` 函数的作用是阻塞等待指定的信号集中的信号,直到其中一个信号被捕获到。`sigwait()` 函数的原型为:
```c
int sigwait(const sigset_t *set, int *sig);
```
其中,`set` 是一个指向信号集的指针,它包含了要等待的信号;`sig` 是一个指向整数的指针,用于存储捕获到的信号的编号。
在给定的代码中,首先使用 `sigemptyset()` 函数清空了 `set` 信号集,然后使用 `sigaddset()` 函数向 `set` 中添加了三个信号:`SIGINT`、`SIGTERM` 和 `SIGHUP`。这意味着程序将等待这三个信号中的任何一个。
然后,通过调用 `pthread_sigmask()` 函数将 `set` 信号集设置为线程的信号掩码,以阻塞这三个信号。这样,当线程执行到 `sigwait()` 函数时,它将被阻塞,直到其中一个信号被捕获到。
最后,通过调用 `sigwait()` 函数等待信号,并将捕获到的信号存储在 `sig` 变量中。接下来的代码根据捕获到的不同信号做出相应的处理。
总结起来,以上代码使用 `sigwait()` 函数和信号集 `set` 实现了线程的同步等待,直到捕获到指定的信号。
补全createThread函数,使用pthread_create函数创建线程,并将start_routine作为线程处理函数,arg作为线程处理函数的参数,同时将创建成功的线程ID作为createThread函数的返回值。 测试说明
在C语言中,使用POSIX线程库(pthread)创建线程通常需要包含头文件`#include <pthread.h>`,然后编写如下的`createThread`函数:
```c
#include <pthread.h>
#include <stdio.h>
typedef void (*thread_routine)(void *arg); // 定义线程处理函数的类型
// 创建线程函数
pthread_t createThread(thread_routine start_routine, void *arg) {
pthread_t thread_id; // 存储线程ID
pthread_attr_t attr; // 线程属性
// 初始化线程属性
pthread_attr_init(&attr);
// 设置线程属性(例如堆栈大小、优先级等)
// 在这里假设没有特殊设置,仅创建线程
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); // 创建非挂起的线程
// 创建线程
if (pthread_create(&thread_id, &attr, start_routine, arg)) {
printf("Error creating thread: %s\n", strerror(errno));
return PTHREAD_FAILURE; // 返回错误标识
}
// 清理线程属性,不是必需的,但如果要释放资源,可以这样做
pthread_attr_destroy(&attr);
return thread_id; // 返回成功创建的线程ID
}
// 测试示例线程处理函数
void start_routine(void *param) {
printf("Thread ID: %lu, Parameter: %p\n", (unsigned long)pthread_self(), param);
}
int main() {
pthread_t my_thread;
void *dummy_arg = NULL;
// 调用createThread函数创建线程
my_thread = createThread(start_routine, dummy_arg);
// 检查是否创建成功
if (my_thread != PTHREAD_FAILURE) {
printf("Thread created successfully with ID: %ld\n", (long)my_thread);
} else {
printf("Thread creation failed.\n");
}
return 0;
}
```
在这个例子中,`createThread`函数接受一个指向`thread_routine`类型的指针和一个用户提供的参数,然后调用`pthread_create`创建新线程。线程处理函数`start_routine`接收传入的参数并进行相应的操作。
阅读全文