当前位置:首页 » 操作系统 » linuxpthreadcreate

linuxpthreadcreate

发布时间: 2023-01-24 17:16:09

‘壹’ 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);
}

这样就行呀, 加锁后另一个要等待锁释放

热点内容
服务器网卡硬件型号怎么看 发布:2024-05-19 18:36:41 浏览:665
修改pve服务器ip 发布:2024-05-19 18:31:52 浏览:468
微信密码忘记了如何取出里面的钱 发布:2024-05-19 18:27:35 浏览:329
vs2005反编译 发布:2024-05-19 18:26:34 浏览:363
ug启动语言脚本 发布:2024-05-19 18:25:57 浏览:874
缓存服务器技术 发布:2024-05-19 18:25:56 浏览:885
androidlistview横向 发布:2024-05-19 18:21:02 浏览:704
多看ftp 发布:2024-05-19 18:11:31 浏览:543
给定一个算法 发布:2024-05-19 17:50:08 浏览:864
恋爱生物种离线缓存 发布:2024-05-19 17:49:15 浏览:579