pthread_setcurrency生效问题

clark2009 clark2009 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
UNPV2 129页set_concurrency无法生效。我的虚拟机是单核,Ubuntu 2.6.32-36-generic。pthread_getconcurrency为0,set以后返回值正确;再次get也是正确的。程序执行还是单线程执行。
看网上说,多核涉及到绑定CPU,不是很理解。 我的是单核,应该不存在绑定CPU的问题。哪位大侠科普一下


#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sched.h>

#define MAXITEMS 100*10000
#define MAXTHREADS 100
#define min(a, b) a<b?a:b

int nitems;
struct {
pthread_mutex_t mutex;
int buff[MAXITEMS];
int nput;
int nval;
}shared = {PTHREAD_MUTEX_INITIALIZER};
void *producer(void*), *consumer(void*);


struct Node{
int count;
int num;
};

int main(int argc, char **argv)
{
int i, nthreads;
struct Node count[MAXTHREADS];

pthread_t tid_producer[MAXTHREADS], tid_consumer;

if(argc != 3)
printf("usage: %s items threads!\n", argv[0]),exit(0);


nitems = min(atoi(argv[1]), MAXITEMS);
nthreads = min(atoi(argv[2]), MAXTHREADS);
printf("nitems=%d, nthreads=%d\n", nitems, nthreads);


//for more CPUS, must bind to one cpu
int level = pthread_getconcurrency();
printf("getconcurrency = %d\n", level);

if(pthread_setconcurrency(nthreads) != 0)
printf("setconcurrency error:%d,%s\n", errno, strerror(errno)), exit(0);
else{
level = pthread_getconcurrency(nthreads);
printf("after set=%d, getconcurrency = %d\n", nthreads, level);
}



for(i=0;i<nthreads;++i){
count[i].num = i;
count[i].count = 0;
if(pthread_create(&tid_producer[i], NULL, producer, &count[i]) != 0)
printf("create pthread %d error: %d,%s\n", i, errno, strerror(errno)), exit(0);
}

for(i=0;i<nthreads;++i){
pthread_join(tid_producer[i], NULL);
printf("[%d] num[%d] = %d\n", i, count[i].num, count[i].count);
}


pthread_create(&tid_consumer, NULL, consumer, NULL);
pthread_join(tid_consumer, NULL);

// sleep(100);

return 0;
}


void* producer(void *arg)
{
pthread_t pid = pthread_self();
// printf("create pthread %x, val=%d\n", (unsigned int)arg, *(int*)arg);
// sleep(1);
struct Node *p = (struct Node*)arg;
printf("num[%d] = %d\n", p->num, p->count);
while(1){
pthread_mutex_lock(&shared.mutex);
if(shared.nput >= nitems){
pthread_mutex_unlock(&shared.mutex);
return NULL;
}

shared.buff[shared.nput] = shared.nval;
++shared.nput;
++shared.nval;
// printf("running pthread %x\n", (unsigned int)arg);
pthread_mutex_unlock(&shared.mutex);
p->count++;
}

}


void* consumer(void* arg)
{
int i;
for(i=0;i<nitems;++i){
if(shared.buff[i] != i)
printf("buff[%d] = %d\n", i, shared.buff[i]);
}

return NULL;
}




我测试,超过四个线程以后,总是第四个线程执行
...全文

相关推荐

Java微服务如何拆解审计日志查询服务

标题:Java微服务如何拆解审计日志查询服务 内容概要:围绕缓存策略、任务调度、回压控制和审计追踪,拆解Java微服务如何拆解审计日志查询服务的实现细节。 xdronline.com xdrea.com 9g.xinmei6.com xinghaohuanbao.com m.xiker66.com

2601_97068614

港股十档行情tick数据涵盖逐笔成交与委托,记录每笔买卖价格、成交量及挂单明细 逐笔数据包含成交时间、价格、股数、成交方向,委托数据展示买一至买十、卖一至卖十的价格与数量

港股十档行情tick数据涵盖逐笔成交与委托,记录每笔买卖价格、成交量及挂单明细。逐笔数据包含成交时间、价格、股数、成交方向,委托数据展示买一至买十、卖一至卖十的价格与数量。分钟数据汇总每分钟开盘价、最高价、最低价、收盘价、成交量及成交额。历史行情覆盖近十五年,字段清晰完整,便于回溯分析。 数据源:CMES金融数据库

2401_89140926

MO-372A_PQFP-F6_I1p27-R3p8x4p48Z1p1-N5p5C1p24.stp

MO-372A_PQFP-F6_I1p27-R3p8x4p48Z1p1-N5p5C1p24.stp

std86021

光伏储能虚拟同步发电机VSG并网仿真模型(Similink仿真实现)

内容概要:本文介绍了一种光伏储能虚拟同步发电机(VSG)并网的Simulink仿真模型,旨在通过仿真手段实现新能源系统与电网的高效协同运行。该模型深度融合光伏发电与储能系统,借助虚拟同步发电机技术有效提升系统的惯性和阻尼特性,从而显著增强电网在高比例可再生能源接入背景下的稳定性。文中重点阐述了VSG在频率调节、电压支撑及动态响应等方面的优越性能,并提供了完整的仿真框架,支持研究人员进行控制策略优化、参数调整与系统性能验证,有助于推动智能电网与新能源并网技术的发展。; 适合人群:具备一定电力系统基础知识和Simulink仿真经验的科研人员、电气工程及相关专业的研究生或从事新能源并网技术研发的工程师。; 使用场景及目标:① 研究光伏储能系统并网的动态行为;② 设计与优化虚拟同步发电机的控制策略以提高电网稳定性;③ 验证新型控制算法在多时间尺度调度中的有效性;④ 教学演示新能源系统与电网互动的物理机制。; 阅读建议:建议读者结合提供的仿真模型与代码,深入理解VSG的工作原理,尝试修改控制参数以观察系统响应变化,并参考文中提及的Matlab代码实现方式,进一步开展个性化研究与创新设计。

荔枝科研社

基于精确导数和有限差分导数的基于导数的大规模优化算法(改进牛顿法与截断牛顿法)的MATLAB实现.rar

基于精确导数和有限差分导数的基于导数的大规模优化算法(改进牛顿法与截断牛顿法)的MATLAB实现.rar

天天Matlab科研工作室
评论 2
收藏 已收藏
分享
返回顶部
clark2009
Linux/Unix社区 23,224 成员 74,535 内容