当前位置:首页 » 编程语言 » c语言多核线程分配
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言多核线程分配

发布时间: 2023-01-16 06:23:40

c语言 多线程 并发执行 不随机

1:pthread_join和并发不并发没关系,是指等待子线程结束之后才返回。你的代码有一个问题,就是只等待了最后一个线程结束,你的pthread_join的第一个参数,就是最后一个线程的id。不过这个和并发顺序没关系
2:你的CPU是不是只有1个核?多线程只有运行在多核CPU才能真正将线程分配给不同CPU,并发执行(也就是随机执行)。不过我想现在单核CPU不多,除非你是虚拟机只分配了一个核。另外就算单核,如果你线程执行的任务耗时比较长,系统还是会将任务切片交替执行。所以你的问题主要是下面:
3:你的子线程执行的内容只有一个打印,执行的速度几乎等于创建速度,也就是刚创建线程,线程就执行完了,导致根本来不及随机分配,你可以在子线程里多做一些事情,比如每个子线程连续打印1000行,你再看下就会发现多线程确实是随机执行的。

⑵ 我想精通C语言编程,求高手指导学习方案。(比如C如何实现多线程,和多核程序设计等等)

想精通C就必须要了解底层知识,尤其是编译原理,当你自己用C做出了一款C语言编译器,基本可以说是精通C了(编译器通常分两部分,其中一部分是与CPU相关的驱动程序,这个可以直接用现成的,但语法分析以及语义分析之类的的要自己写)。还有你问C如何实现多线程,我不太确定是什么意思?你是想用C程序通过调用现有的线程库来实现多线程编程还是想问如何用C现实出多线程的过程(也就是线程库的制作)?前者随便网上一搜就有一堆方法,后者基本只能在Linux上做,看看Linux内核中有关多线程实现的源代码就差不多了(建议先读一读Linux内核设计与实现第3版再看代码)

⑶ c语言多线程

因为您传入的是t的地址:rc = pthread_create(&thread[t], NULL, PrintHello, &t);

所以在PrintHello函数中thread_arg = (int)(*((int*)args));读取时会读取到t的最新值,即8.

这是因为主线程一直在执行,for( t = 0; t < NUM_THREADS; t++ )很快执行完,跳出循环t的值为8,而在PrintHello中sleep(1);肯定会读取到t的最新值8.

直接传t的值即可,如下:

#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>//加入这个头文件
#include<pthread.h>
#include<unistd.h>

#defineNUM_THREADS8

void*PrintHello(void*args)
{
intthread_arg;
sleep(1);
thread_arg=(int)(uintptr_t)args;//这样读取传来的t的值
printf("Hellofromthread%d ",thread_arg);
returnNULL;

}

intmain(void)
{
intrc,t;
pthread_tthread[NUM_THREADS];
for(t=0;t<NUM_THREADS;t++)
{
printf("Creatingthread%d ",t);
rc=pthread_create(&thread[t],NULL,PrintHello,(void*)(uintptr_t)t);//这样传t的值
if(rc)
{
printf("ERROR;returncodeis%d ",rc);
returnEXIT_FAILURE;
}
}
sleep(5);
for(t=0;t<NUM_THREADS;t++)
pthread_join(thread[t],NULL);
returnEXIT_SUCCESS;
}

⑷ C语言怎样实现多线程

首先你要有控制蛇移动方向的全局变量(定义在main以外因为线程函数也要调用它,每次键盘输入都会修改它的值), 比如 char direction 'a' ==左 'w' == 右 'd'==上 's' == 下,然后你在移动时应该是在while里面操作的吧,你每移动一步前都读一下direction这个变量的数值然后再控制移动方向(注意s这个键可以忽略因为不会倒着走) 然后你可以用pthread.h这个库 例子是 pthread t;// 定义一个线程 pthread_create(&t, null, listen_keyboard_input, null);//建立线程执行listen_keyboard_input这个函数 这个线程执行的函数 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ direction =getchar(); } } 但是这里存在同步问题, 比如当这个线程的getchar()在给direction辅助的同时,你控制贪吃蛇移动的线程正在调用 direction的值来判断下一个移动方向,这就会出问题,所以要加一个锁,叫 mutex lock;这个也定义成全局变量可以使各线程共享。 pthread_mutex_t mutex; //定义一个锁 pthread_mutex_init(&mutex, null, null);//初始化 然后把函数修改成 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ pthread_mutex_lock(&mutex); direction =getchar(); pthread_mutex_unlock(&mutex); } } 另外一个控制贪吃蛇移动的时候也要加锁 while(.....){ char c; pthread_mutex_lock(&mutex); c = direction; pthread_mutex_unlock(&mutex); switch(c){ ................ } ................................... } 这样就好了 注意你的控制贪吃蛇移动的部分也必须要放在另外一个pthread 里面执行,如果放在主线程, 主线程会一直等listen_keyboard_input而什么事都不会做 你把这两个线程用 pthread_create 创建完成后 用 t1.join(); t2.join(); 就可以使这两个线程并发执行了 如果你用的是linux 来编译的,你再输入gcc 指令后加上 -lpthread 就可以了 还有什么不懂的你可以多找找 pthread 类的例子

⑸ C语言多线程的操作步骤

线程创建
函数原型:intpthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);
返回值:若是成功建立线程返回0,否则返回错误的编号。
形式参数:pthread_t*restrict tidp要创建的线程的线程id指针;const pthread_attr_t *restrict attr创建线程时的线程属性;void *(start_rtn)(void)返回值是void类型的指针函数;void *restrict arg start_rtn的形参。
线程挂起:该函数的作用使得当前线程挂起,等待另一个线程返回才继续执行。也就是说当程序运行到这个地方时,程序会先停止,然后等线程id为thread的这个线程返回,然后程序才会断续执行。
函数原型:intpthread_join(pthread_tthread, void **value_ptr);
参数说明如下:thread等待退出线程的线程号;value_ptr退出线程的返回值。
返回值:若成功,则返回0;若失败,则返回错误号。
线程退出
函数原型:voidpthread_exit(void *rval_ptr);
获取当前线程id
函数原型:pthread_tpthread_self(void);
互斥锁
创建pthread_mutex_init;销毁pthread_mutex_destroy;加锁pthread_mutex_lock;解锁pthread_mutex_unlock。
条件锁
创建pthread_cond_init;销毁pthread_cond_destroy;触发pthread_cond_signal;广播pthread_cond_broadcast;等待pthread_cond_wait。

⑹ C语言能实现多线程么

可以通过调用C语言函数库pthread里的函数,创建多线程。

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

C语言最初并未设计多线程的机制,随着软硬件的发展及需求的发展,C语言才开发了线程库以支持多线程的操作和应用。

⑺ C语言怎样才能发挥双核双CPU的作用

想利用多核,要不得写多线程程序;要不CPU得能优化,自动分配指令到不同CPU上;
图像处理可以用一个线程来负责计算,另一个线程负责显示;

CPU优化这个我也不太清楚,好像是CPU自己根据指令决定的;
因为一般的程序都是单线程的,集中在一个CPU上也挺合乎情理的。

⑻ c语言实现多线程

目录:

  1. Linux操作系统,C语言实现多线程

  2. Windows操作系统,C语言实现多线程

  3. Windows下的多线程(不带停止)

Linux操作系统,C语言实现多线程:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
void*ThreadOne(void*threadArg)
{
printf("线程开始啦,参数是:%s ",(char*)threadArg);
returnNULL;
}
intmain(void)
{
pthread_tThreadID;/*记录线程标识符*/
void*waitingResult;/*等待线程退出的等待结果*/
interrorCode;/*记录线程的错误代码*/
char*aMessage="这是线程的参数";
/*创建并启动线程ThreadOne。若返回值非零,则线程创建失败*/
errorCode=pthread_create(&ThreadID,NULL,ThreadOne,aMessage);
if(errorCode!=0)
{
printf("线程ThreadOne创建失败。错误代码:%d ",errorCode);
returnEXIT_FAILURE;
}
/*等待线程标识符为的ThreadID的线程结束*/
errorCode=pthread_join(ThreadID,&waitingResult);
if(errorCode!=0)
{
printf("等待线程退出等待失败。错误代码:%d ",errorCode);
returnEXIT_FAILURE;
}
printf("线程的返回值是%p ",waitingResult);
returnEXIT_SUCCESS;
}

Windows操作系统,C语言实现多线程:

#include<stdio.h>
#include<windows.h>
DWORDAPIENTRYThreadOne(LPVOIDthreadArg)
{
printf("线程开始啦,参数是:%s ",(char*)threadArg);
return0;
}
intmain(void)
{
HANDLEhThread;/*记录线程句柄*/
DWORDThreadID;/*记录线程ID号*/
DWORDwaitingResult;/*等待线程退出的等待结果*/
DWORDthreadExitCode;/*记录线程的返回值*/
char*aMessage="这是线程的参数";
/*创建并启动线程ThreadOne,返回值为线程句柄,赋值给hThread*/
hThread=CreateThread(NULL,0L,ThreadOne,(LPVOID)aMessage,0L,&ThreadID);
if(hThread==NULL)
{
printf("线程ThreadOne创建失败。错误代码:%lu ",GetLastError());
returnEXIT_FAILURE;
}
/*等待线程句柄为的hThread线程结束*/
waitingResult=WaitForSingleObject(hThread,INFINITE);
if(waitingResult==WAIT_FAILED)
{
printf("等待线程退出等待失败。错误代码:%lu ",GetLastError());
returnEXIT_FAILURE;
}
if(GetExitCodeThread(hThread,&threadExitCode))
printf("线程的返回值是%lu ",threadExitCode);
else
printf("获取线程的返回值获取失败。错误代码:%lu ",GetLastError());
returnEXIT_SUCCESS;
}

Windows下的多线程:(不带停止)

#include<stdio.h>
#include<windows.h>
DWORDWINAPIoxianchen(LPVOIDlpParam);
intmain(intargc,char*argv[])
{
intnum=0;
CreateThread(NULL,NULL,oxianchen,&num,NULL,NULL);
while(1)
{
num++;
printf("主线程!%05d ",nu***eep(40);
}
return0;
}
DWORDWINAPIoxianchen(LPVOIDlpParam)
{
int*a=lpParam;
while(1)
{
++*a;
printf("副线程!%05d0x%p ",*a,a);
Sleep(80);
}
return0;
}

⑼ 编写一个多线程的C程序 分割数据并分发给每个线程

不如贴英文原版要求,中文翻译出来的要求看着不是很明白