linuxpthreadcreate
‘壹’ 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\n", *(int *)xa);
......
}
‘贰’ 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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h> /*pthread_create()......*/
#include <unistd.h>
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\n", strerror(err));
exit(1);
}
pthread_join(ntid,NULL); /*...1.....*/
for(i = 0 ; i<=n ; i++){
printf("F[%d] = %d\n",i,a[i]);
}
}
‘叁’ 用Linux,pthread相关函数创建一个调度策略为NORMAL,priority=15的线程,
NORMAL的调度策略是什么?
创建一个线程很简单,用pthread_create就可以做到,具体使用方法你man下或者搜索都有。
需要提到的是你要改变调度策略和优先级,我查了下,用sched_setscheler就可以做到了:
int sched_setscheler(pid_t pid, int policy, const struct sched_param *param);
policy是设置调度策略,param是设置优先级。
‘肆’ linux下用这个makefile链接线程库老提示pthread_create未找到,请高手详细解答!谢谢!
好奇怪。。。你的脚本里面加了-lpthread啊,单独用命令编译下,看行不?
‘伍’ linux下如何使用pthread_create创建2线程
printf("1\n");
printf("2\n");
不可能不执行吧,除非你的程序其它地方有问题,比如juzhen1或juzhen2有问题,导致程序挂掉了
还有顺便说一句,你这个时间统计根本就是创建两个线程的所消耗的时间,而不是这两个线程执行的时间,如果你要统计这两个线程执行时间,你应该在
pthread_join(pid1, NULL);
pthread_join(pid2, NULL);
end=clock();
这样只有在两个线程执行完后才会执行end=clock();这一句
还有 pthread_t pid1, pid2这两句最好改成 pthread_t tid1, tid2;要学会良好的变量命名习惯,这样对你以后有好处。
‘陆’ 在linux中用pthread_create()创建一个新线程,不能执行execl函数
可以啊 只不过用了excel之后就不执行它后面的语句了。 所以你应该用fork创建一个新进程
‘柒’ linux 下pthread_create函数参数问题
问题出在类型转成指针上,和 tid_num应该没关系。chat 参数应该是一个原型类似于下面的函数的函数:
void * function(void *arg)。 你不应该将chat函数强制转换成 void *
‘捌’ linux c编程中,使用pthread_create函数创建线程时,函数的第3个参数的是void
可以这样声明,但是在调用pthread_create函数的时候需要将线程函数的指针强制类型转换成void *(pthread)(void*),否则编译器会报错。
‘玖’ Linux多线程编译中为什么说pthread_create未定义
问题描述说的太简单了,完全无法回答嘛
至少把出错信息完整的帖一遍阿
循环接收有两种方法:多线程+同步接收 ; 单线程+异步接收
其实异步接收也不是单线程,只是需要你管理的线程只有一个而已
‘拾’ Linux下的线程库pthread库中的pthread_create()函数创建两个线程。
void * thread1() //线程1
{
//............. pthread_mutex_lock(&mut);
a += 1; //①
b = a; //②
pthread_mutex_unlock(&mut);
}
void * thread2() //线程2
{
//.............
pthread_mutex_lock(&mut);
a += 2;
pthread_mutex_unlock(&mut);
}
这样就行呀, 加锁后另一个要等待锁释放