ret=pthread_create(&id,NULL,(void *)thread,NULL);什么用
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。
安卓NDK+Eclipse:创建线程时:pthread_create sched_setscheduler call failed:Operation not permitted
① 需要检查有没有加载 pthread 库;
② 检查没有调用 pthread.h 头文件;
③ 检查 pthread 对应的函数,头文件中有没有申明;
④ 可以考虑c++的thead类;
我是ndk吧的吧主,有问题也可以到ndk吧留言,谢谢!
LINUX 传递‘pthread_create’的第 3 个参数时在不兼容的指针类型间转换
需要修改的不是pthread_create的第3个参数,而是第3个参数对应的线程函数的函数原型,线程函数的原型是这样的形式:
void *(*start_routine) (void *);
线程函数的参数和返回值都是一个void指针,而你写的线程函数的参数却是一个int指针,把线程函数的参数修改成void *类型就可以了。
如果你需要int型,可以这样写(用强制类型转换,因为线程函数的参数是void *,所以这在线程函数内部经常这样用):
void * xxx(void *xa)
{
printf("Thread function argument was %d
", *(int *)xa);
......
}
pthread_create函数返回1,也就是说创建线程失败了,这是哪里有问题,麻烦各位帮忙一下
我也碰到同样的问题,我把这一行pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);//注释掉
就好了,而且attr中的属性值也设置到线程里去了。
如果不注释的话,就换成ROOT用户执行,因为修改线程调度策略需要超级用户。
linux pthread_create() 产生斐波那契数列
1. pthread_join 是阻塞函数,运行该函数后主线程会阻塞等待子线程操作结束,你把pthread_join放在主线程输出之后,存在这样的问题:在子线程还没赋值完成前,父线程已经把未操作的值输出了。
2.传递参数错误,pthread_create传递的是"&a",也就是数组的起始地址的地址,你只是改变数组值,不需要对起始地址更改,完全可以传递 a,而且看你thread_fun函数应该传递的是a。
3. 最关键的,我纳闷怎么没输出,检查了下你的thread_fun才发现“for(k=2;k<=512;k++)”,数组越界了! 造成的结果是把n值直接给改了。
。
修改版 (有warning, 最好把参数设成void *):
#include
#include
#include
#include /*pthread_create()......*/
#include
pthread_t ntid;
void *thread_fun(int *p) {/*.......*/
int k;
p[0] = 0;
p[1] = 1;
for(k=2;k<512;k++)
{
p[k] = p[k-1] + p[k-2];
}
return NULL;
}
int main(void){
int err;
int i,n;
int a[512];
printf("Please enter n:(n>=3 & n<=512) ");
scanf("%d",&n);
/*........*/
err=pthread_create(&ntid,NULL,thread_fun,(void *)a);
if (err!=0) {
fprintf(stderr, "......: %s
", strerror(err));
exit(1);
}
pthread_join(ntid,NULL); /*...1.....*/
for(i = 0 ; i<=n ; i++){
printf("F[%d] = %d
",i,a[i]);
}
}ps命令下pthread_create的fork的区别
确实..linux下的线程是假线程..只是和主线程拥有一样的地址映射表而已..然而POSIX制定了一些列thread standard..
其中就包括查看进程列表的时候, 相关的一组task_struct应当被展现为列表中的一个节点。
并且linux 2.6之后就实现了这个了,所以确实是遍历task_struct结构体,只是它们并不诚实。
好,其实你想知道的是为啥可以知道task_struct是一组的对不?你可以去看看task_struct结构里有
- pid_t tgid;
//identifier of the thread group leader
然后你就知道了...这个tgid是这个进程主线程的pid(也可以理解为线程组中第一个创建的线程的pid)