linux多线程编程linux单进程如何实现多核cpu多线程分配?
linux多线程编程 时间:2020-12-30 阅读:(
)
在Linux环境下,对一个设备文件进行多线程读写(两个线程就行),求大神给一个简单的程序。
配置文件为 conf.txt
测试代码如下,注意链接的时候加上 -lpthread 这个参数
#include <stdio.h>
#include <errno.h> //perror()
#include <pthread.h>
#include <unistd.h> //sleep()
#include <time.h> // time()
#include <stdlib.h> //rand()
#define FD "conf.txt"
typedef void *(*fun)(void *);
struct my_struct
{
unsigned time_to_wait;
int n;
};
void *test_thread(struct my_struct *);
int main (int argc, char const *argv[])
{
FILE *fp = fopen(FD, "r");
if (fp == NULL)
{
perror(FD);
return -1;
}
srand((unsigned)time(NULL)); //初始化随机种子
int thread_count;
fscanf(fp, "%d", &thread_count);
fclose(fp);
if (thread_count <= 0)
{
printf("线程数<1,退出程序。
");
return -1;
}
pthread_t *ptid = (pthread_t *)malloc(sizeof(pthread_t) * thread_count); //保存线程ID
int i;
for (i = 0; i < thread_count; i++)
{
int tw = rand() % thread_count + 1; //随机等待时间
struct my_struct * p = (struct my_struct *)malloc(sizeof(struct my_struct));
if (p == NULL)
{
perror("内存分配错误");
goto ERROR;
}
p->time_to_wait = tw;
p->n = i + 1;
int rval = pthread_create(ptid + i, NULL, (fun) test_thread, (void *)(p)); //注意这里的强制转换(两个)
if (rval != 0)
{
perror("Thread creation failed");
goto ERROR;
}
//sleep(1); //这句加也可以,不加也可以。
最开始的时候加上这个是为了让两个线程启动的时候之间有一定的时间差
}
printf("主线程启动
");
fflush(stdout);
for (i = 0; i < thread_count; i++)
{
pthread_join(*(ptid + i), NULL); //等待所有线程退出。
}
printf("
主线程退出
");
ERROR:
free(ptid);
return 0;
}
void *test_thread(struct my_struct * p) //线程启动的时候运行的函数
{
printf("第%d个线程启动,预计运行%d秒
", p->n, p->time_to_wait);
fflush(stdout);
sleep(p->time_to_wait); //让线程等待一段时间
printf("第%d个线程结束
", p->n);
fflush(stdout);
free(p);
return NULL;
}
你的第二个问题我在百度HI回你了~在Linux下用C++创建新线程
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void* thread(void* arg)
{
printf ("The child process...
");
}
int main(int argc, char *argv[])
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *)thread,NULL);
if(ret!=0)
{
printf ("Create pthread error!
");
exit (1);
}
}
程序如上就可以编译。
它属于linux下C编程中多线程编程的范围。
用命令
-lpthread 1.c -o 1
./1
就可以出结果。
多线程编程的基础可以参考
/huifeng00/blog/item/ed13ddc0d6c59c170ff47715.html最近在学linux中多线程编程,发现很多函数参数为void *retval,这是什么意思啊,是说retval这个指针是指向
这个一般是用来返回结构体指针的 结构体是没有确定类型的 多线程里面的参数也是void * arg 这样的话 更通用 你可以传任意类型 也可以返回任意类型 但是要做强制类型转换linux单进程如何实现多核cpu多线程分配?
linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主要有2个方法
1:利用linux系统自己的线程切换机制,linux有一个服务叫做irqbalance,这个服务是linux系统自带的,默认会启动,这个服务的作用就是把多线程平均分配到CPU的每个核上面,只要这个服务不停止,多线程分配就可以自己实现。
但是要注意,如果线程函数内部的有某个循环,且该循环内没有任何系统调用的话,可能会导致这个线程的CPU时间无法被切换出去。
也就是占满CPU现象,此时加个系统调用,例如sleep,线程所占的CPU时间就可以切换出去了。
2:利用pthread库自带的线程亲和性设置函数,来设置线程在某个CPU核心上跑,这个需要在程序内部实现。
同时注意不要和进程亲和性设置搞混淆了
int?pthread_setaffinity_np(pthread_t?thread,?size_t?cpusetsize,
const?cpu_set_t?*cpuset);
int?pthread_getaffinity_np(pthread_t?thread,?size_t?cpusetsize,?
cpu_set_t?*cpuset);
从函数名以及参数名都很明了,唯一需要点解释下的可能就是cpu_set_t这个结构体了。
这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:
//初始化,设为空
void?CPU_ZERO?(cpu_set_t?*set);?
//将某个cpu加入cpu集中?
void?CPU_SET?(int?cpu,?cpu_set_t?*set);?
//将某个cpu从cpu集中移出?
void?CPU_CLR?(int?cpu,?cpu_set_t?*set);?
//判断某个cpu是否已在cpu集中设置了?
int?CPU_ISSET?(int?cpu,?const?cpu_set_t?*set);
RFCHOST,这个服务商我们可能有一些朋友知道的。不要看官网是英文就以为是老外服务商,实际上这个服务商公司在上海。我们实际上看到的很多商家,有的是繁体,有的是英文,实际上很多都是我们国人朋友做的,有的甚至还做好几个品牌域名,实际上都是一个公司。对于RFCHOST商家还是第一次分享他们家的信息,公司成立大约2015年左右。目前RFCHOST洛杉矶机房VPS正进行优惠促销,采用CN2优化线路,电信双...
CloudCone的[2021 Flash Sale]活动仍在继续,针对独立服务器、VPS或者Hosted email,其中VPS主机基于KVM架构,最低每月1.99美元,支持7天退款到账户,可使用PayPal或者支付宝付款,先充值后下单的方式。这是一家成立于2017年的国外VPS主机商,提供独立服务器租用和VPS主机,其中VPS基于KVM架构,多个不同系列,也经常提供一些促销套餐,数据中心在洛杉...
spinservers是一家主营国外服务器租用和Hybrid Dedicated等产品的商家,Majestic Hosting Solutions LLC旗下站点,商家数据中心包括美国达拉斯和圣何塞机房,机器一般10Gbps端口带宽,且硬件配置较高。目前,主机商针对达拉斯机房机器提供优惠码,最低款Dual E5-2630L v2+64G+1.6TB SSD月付89美元起,支持PayPal、支付宝等...
linux多线程编程为你推荐
软银赛富民信排在投资公司第几美团月付怎么关闭商家退出美团怎么退电脑杀毒软件哪个好电脑什么杀毒软件最好手动挡和自动挡哪个好自动挡和手动挡哪个更好一点朱祁钰和朱祁镇哪个好朱高炽是不是被朱瞻基谋杀的?朱祁镇和朱祁钰谁更好音乐播放器哪个好最好的音乐播放器是什么加速器哪个好英雄联盟有什么加速器好用的?手机炒股软件哪个好什么手机炒股软件好用,你们都用哪个固定利率和浮动利率哪个好应当选择固定利率,还是选择浮动利率还款?辽宁联通网上营业厅网联通宽带好不好用
鲁诺vps 阿里云os 荣耀欧洲 photonvps 主机测评网 新世界电讯 免费个人博客 卡巴斯基官方免费版 炎黄盛世 赞助 isp服务商 申请网页 服务器维护 winserver2008 百度新闻源申请 apache启动失败 带宽测速 symantec screen 文件传输 更多