pthread_create invalid conversion from int to void*
时间: 2023-08-24 19:13:05 浏览: 259
这个问题可能是因为 `pthread_create` 函数的第三个参数需要传入一个 `void*` 类型的指针,但是你传入了一个 `int` 类型的值。
解决方法是将 `int` 类型的值转换成 `void*` 类型,然后再传入函数中。可以使用 C 语言中的类型转换操作符 `(void*)`,如下所示:
```
int arg = 123;
pthread_create(&thread_id, NULL, my_thread_function, (void*)arg);
```
在线程函数中,需要将参数再转换回 `int` 类型,如下所示:
```
void* my_thread_function(void* arg) {
int my_arg = (int)arg;
// do something with my_arg
}
```
注意,这种方法只适用于传递简单类型的参数,如果需要传递复杂的数据结构,建议使用指针。
相关问题
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <pthread.h> #include <semaphore.h> void * pthread_odd_function(void * arg); void * pthread_even_function(void * arg); pthread_mutex_t work_mutex; pthread_cond_t work_cond; #define MAX_COUNT 10 int count = 0; int main(int argc, char const *argv[]) { pthread_t pthread_odd; pthread_t pthread_even; pthread_attr_t pthread_attr; int res; res = pthread_attr_init(&pthread_attr);//init pthread attribute,step 1 if (res != 0){ perror("pthread_attr_init failed!"); exit(EXIT_FAILURE); } res = pthread_cond_init(&work_cond,NULL); if (res != 0){ perror("pthread_cond_init failed!"); exit(EXIT_FAILURE); } res = pthread_mutex_init(&work_mutex,NULL); if (res != 0){ perror("pthread_mutex_init failed!"); exit(EXIT_FAILURE); } pthread_attr_setdetachstate(&pthread_attr,PTHREAD_CREATE_DETACHED);//design pthread attribute step 2 res = pthread_create(&pthread_odd,&pthread_attr,pthread_odd_function,NULL);//step 3 if (res != 0){ perror("pthread_create failed!"); exit(EXIT_FAILURE); } res = pthread_create(&pthread_even,&pthread_attr,pthread_even_function,NULL); if (res != 0){ perror("pthread_create failed!"); exit(EXIT_FAILURE); } while(count < MAX_COUNT) ; //wait the two sons threads finished pthread_mutex_destroy(&work_mutex); pthread_cond_destroy(&work_cond); pthread_exit(NULL); return 0; } void * pthread_odd_function(void *arg)//step 4 { pthread_mutex_lock(&work_mutex); while(count < MAX_COUNT){ if (count % 2 == 1){ printf("the odd count is : %d\n", count); ++count; pthread_cond_signal(&work_cond);//in order to release the thread of even } else pthread_cond_wait(&work_cond,&work_mutex);//the pthread is blocked,wait for the condition } pthread_mutex_unlock(&work_mutex); } void * pthread_even_function(void *arg)//step 5 { pthread_mutex_lock(&work_mutex); while(count < MAX_COUNT){ if (count % 2 == 0){ printf("the even count is : %d\n", count); ++count; pthread_cond_signal(&work_cond);//in order to release the thread of odd } else pthread_cond_wait(&work_cond,&work_mutex);//wait the condition satisfied } pthread_mutex_unlock(&work_mutex); }给我讲一下这段代码
这段代码是一个线程同步的例子,它创建了两个线程,一个线程打印出所有奇数,另一个线程打印出所有偶数。具体来说,代码中使用了互斥锁和条件变量来保证线程同步。互斥锁的作用是保护共享资源,只允许一个线程访问该资源。条件变量用于线程之间的通信,当一个线程需要等待某个条件满足时,它会进入阻塞状态,等待其他线程发送信号通知它条件已满足。
在主函数中,先初始化了互斥锁和条件变量,然后创建了两个线程,并使用pthread_attr_setdetachstate函数将线程属性设置为PTHREAD_CREATE_DETACHED,表示线程被创建后马上就进入分离状态,不需要等待其他线程回收资源。接着主线程进入一个循环,等待两个子线程执行完毕。
在子线程中,先获取互斥锁,进入while循环,判断count是否小于最大值,如果是,则进入条件判断。奇数线程打印出奇数并将count加1,然后调用pthread_cond_signal函数发送信号通知偶数线程可以执行了。偶数线程同样进入条件判断,打印出偶数,将count加1,然后调用pthread_cond_signal函数通知奇数线程可以执行了。如果条件不满足,则调用pthread_cond_wait函数将线程阻塞,等待其他线程发送信号通知它条件已满足。最后释放互斥锁,线程结束。
值得注意的是,条件变量的使用必须与互斥锁一起使用,否则可能会出现竞争条件,导致程序出现错误。
给以下代码写注释:#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> long int var = 0; void *tfn1(void *arg) { int i = var; for (int j = 0; j < 3; j++) { i = i + j; } printf("%d\n",i); pthread_exit((void *)i); return NULL; } int main(void) { pthread_t tid1; int *ret1; pthread_create(&tid1, NULL, tfn1, NULL); pthread_join(tid1, (void **)&ret1); printf("the result is %d\n",ret1); pthread_exit(NULL); }
注释如下:
```c
#include <stdio.h> // 标准输入输出库
#include <stdlib.h> // 标准库
#include <pthread.h> // POSIX线程库
#include <unistd.h> // 提供对 POSIX 操作系统 API 的访问
long int var = 0; // 声明一个全局变量 var,初值为 0
// 线程函数 tfn1,传入参数 arg,返回类型为 void*
void *tfn1(void *arg) {
int i = var; // 定义一个局部变量 i,初值为 var 的值
for (int j = 0; j < 3; j++) { // 循环 3 次,每次将 j 加到 i 上
i = i + j;
}
printf("%d\n",i); // 打印 i 的值
pthread_exit((void *)i); // 线程退出,并返回 i 的值
return NULL; // 返回 NULL
}
// 主函数
int main(void) {
pthread_t tid1; // 定义线程 tid1
int *ret1; // 定义返回值指针
pthread_create(&tid1, NULL, tfn1, NULL); // 创建线程,传入线程 id、属性、线程函数和参数
pthread_join(tid1, (void **)&ret1); // 等待线程结束,并获取线程返回值
printf("the result is %d\n",ret1); // 打印线程的返回值
pthread_exit(NULL); // 线程退出
}
```
阅读全文