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

c语言如何使用多线程

发布时间: 2023-05-06 08:12:58

Ⅰ 多线程怎么用

如何实现多线程
两种方式:

继承Thread类,重写run方法

实现Runnable接口,实现run方法。

启动线程调用线程的start方法。

如何用多线程来处理一个问题?
每个线程只完成一个数的累积和,(用线程的参数来传递指定的数),不要把数组里面的所有数都进行计算。

你可以传给线程的时候,除了传递输入输出数组以外租正让,再传递一个index。线程中只处理这个index位置上的数就可以了。
Java线程怎样使用?
Thread线程类,该类有一个共有的无返回值不带参数的run方法。

可以用子类继承Thread类然后重写run方法。

class T extends Thread{public void run(){while(true){System.out.println("xx"); } 范 }使用是声明改自定义类对象,调用start方法启动线程。

Thread t=new T();t.strat();线程启动执行类中run方法中预制的代码。

也可以通过实现线程接口Runnable来创建线程

Thread t=new Thread(new Runnable{public void run(){代码 }});t.start();
多线程有几种实现方法
线程建立/执行:

HANDLE Handle1;

DWORD ID1;

Handle1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&ID1);

线程等待:

WaitForSingleObject(Handle1,INFINITE);

线程同步---生产者消费者:

HANDLE m_S_Consumer;

m_S_Consumer = CreateSemaphore(NULL,0,20, NULL);创建,最多允许有20个产品等待使用,初始0个

ReleaseSemaphore(m_S_Consumer,1,NULL);生产1个

if(WaitForSingleObject(m_S_Consumer,INFINITE) == WAIT_OBJECT_0){消费1个

......

}
如何使用线程
java平台从开始就被设计成为多线程环境。在你的主程序执行的时候,其它作业如碎片收集和事件处理则是在后台进行的。本质上,你可以认为这些作业是线程。它们正好是系统治理线程,但是无论如何,它们是线程弊局。线程使你能够定义相互独立的作业,彼此之间互不干扰。系统将交换这些作业进或出CPU,这样(从外部看来)它们好象是同时运行的。 在你需要在你的程序中处理多个作业时,你也可以使用多个进程。这些进程可以是你自己创建的,你也可以操纵系统线程。 你进行这些多作业处理,要使用几个不同的类或接口: java.util.Timer类

javax.swing.Timer类Thread类Runnable接口 对于简单的作业,通常需要重复的,你可以使用java.util.Timer类告诉它“每半秒钟做一次”。清改注重:大多数系统例程是使用毫秒的。半秒钟是500毫秒。 你希望Timer实现的任务是在java.util.TimerTask实例中定义的,其中运行的方法包含要执行的任务。这些在Hi类中进行了演示,其中字符串“Hi”重复地被显示在屏幕上,直到你按Enter键。 import java.util.*;

public class Hi {

public static void main(String args[])

throws java.io.IOException {

TimerTask task = new TimerTask() {

public void run() {

System.out.PRintln("Hi");}};Timer timer = new Timer();

timer.schele(task, 0, 500);

System.out.println("Press ENTER to stop");

System.in.read(new byte[10]);

timer.cancel();}} Java Runtime Environment工作的方式是只要有一个线程在运行,程序就不退出。这样,当取消被调用,没有其它线程在运行了,则程序退出。有一些系统线程在运行,如碎片收集程序。这些系统线程也被称为后台线程。后台线程的存在不影响运行环境被关闭,只有非后台线程保证运行环境不被关闭。 Javax.swing.Timer类与java.util.timer类的工作方式相似,但是有一些差别需要注重。第一,运行的作业被ActionListener接口的实现来定义。第二,作业的执行是在事件处理线程内部进行的,而不象java.util.Timer类是在它的外部。这是很重要的,因为它关系到Swing组件集是如何设计的。 假如你不熟悉Swing,它是一组可以被Java程序使用的图形组件。Swing被设计程被称为单线程的。这意味着对Swing类内部内容的访问必须在单个线程中完成。这个特定的线程是事件处理线程。这样,例如你想改变Label组件的文字,你不能仅仅调用Jlabel的setText方法。相反,你必须确认setText调用发生在事件处理线程中,而这正是javax.swing.Time类派的上用场的地方。 为了说明这第二种情况,下面的程序显示一个增加的计数器的值。美半秒钟计数器的数值增加,并且新的数值被显示。
c语言如何实现多线程同时运行
使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。

然后这个Beep()的需求要进行线程间通信,可以用共享内存的方法,设一个bool变量flag共享,然后beep的时候设为false,beep完设成true。fun()里面每次看一下这个flag,是false的话就不做动作等下一秒,基本可以满足需求。

这样做的好处是实现简单,但时间是以1s为单位的。如果要8秒结束立刻执行,需要用条件变量的方法来控制,比较复杂,这样的实现方式一个可以满足需求了。
如何在for循环中使用多线程
干脆把 i 当做参数传入好了

class Program

{

static int i;

static void Main(string[] args)

{

i = 0;

do

{

new Thread(new ParameterizedThreadStart(s)).Start(i);

i++;

} while (i < 10);

Console.Read();

}

static private void s(object index)

{

Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "," + (int)index);

}

}
如何增加多线程的稳定性
微软官方给出的方案在MSDN里面有说,就是使用ActiveX EXE那种"单元线程模型".

我也曾经试过,的确可以实现"多线程",只是由于要多一个EXE,比较麻烦,后来就没有深入了.

结果一次无意中在VBGOOD中看到一段代码,才打通了一个关节:为什么不直接使用ActiveX EXE写程序呢?!

那段代码里面,是直接使用这种工程类型,然后在工程内使用CreateObject来生成一个新对象,这样的话,新的对象就工作于一个单元线程内了.

其实这个我也知道,可是就没有想到在ActiveX EXE内部使用

看来思路真的不如人.....还要多多学习,多多积累.

ActiveX EXE工程设置为"独立启动"后,貌似只能从Sub Main里进行初始化.

而每个对象的建立,都会调用一次这个过程,因此这个过程需要一次性运行.

但是MSDN里说得很清楚,在单元线程模型里面,全局变量的范围只能是本单元,因此不能使用设置全局变量来完成这个过程的一次运行逻辑.

原代码里使用了GetProp等方式,感觉不是很好,于是作了一下改进,使用事件对象来完成此工作.

Sub Main相关代码如下:

Private Const MyEvent As String = "m5home"

Dim hEvent As Long

Sub Main()

If GetEventHandle = 0 Then '由于每个新对象的建立,都要执行Main()过程,因此使用事件对象来进行判断.

hEvent = CreateEvent(0&, False, False, MyEvent) '在单元线程下,模块里的全局变量已经没有用了.frmMain.Show

End If

End Sub

Private Function GetEventHandle() As Long

GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent)

Call CloseHandle(GetEventHandle)

End Function

Public Function Quit()

Call CloseHandle(hEvent)

End Function

Private Const MyEvent As String = "m5home"

Dim hEvent As Long

Sub Main() If GetEventHandle = 0 Then '由于每个新对象的建立,都要执行Main()过程,因此使用事件对象来进行判断.

hEvent = CreateEvent(0&, False, False, MyEvent) '在单元线程下,模块里的全局变量已经没有用了.frmMain.Show

End If

End Sub

Private Function GetEventHandle() As Long GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent)

Call CloseHandle(GetEventHandle)

End Function

Public Function Quit()

Call CloseHandle(hEvent)

End Function

由于事件对象是系统范围的,因此可......>>
怎样用纯C写一个多线程的程序
这是我以前写的一个多线程范例,凑合看看吧:

#include

#include

#include

using namespace std;

提示出租车到达的条件变量

pthread_cond_t taxiCond;

同步锁

pthread_mutex_t taxiMutex;

旅客到达等待出租车

void * traveler_arrive(void * name)

{

cout<< " Traveler: " <<(char *)name<< " needs a taxi now! " <

pthread_mutex_lock(&taxiMutex);

pthread_cond_wait (&taxiCond, &taxiMutex);

pthread_mutex_unlock (&taxiMutex);

cout<< " Traveler: " << (char *)name << " now got a taxi! " <

pthread_exit( (void *)0 );

}

出租车到达

void * taxi_arrive(void *name)

{

cout<< " Taxi " <<(char *)name<< " arrives. " <

pthread_cond_signal(&taxiCond);

pthread_exit( (void *)0 );

}

int main()

{

pthread_t thread;

pthread_attr_t threadAttr;

pthread_attr_init(&threadAttr);

pthread_create(&thread, & threadAttr, taxi_arrive, (void *)( " Jack " ));

sleep(1);

pthread_create(&thread, &threadAttr, traveler_arrive, (void *)( " Susan " ));

sleep(1);

pthread_create(&thread, &threadAttr, taxi_arrive, (void *)( " Mike " ));

sleep(1);

return 0;

}...>>
线程是什么,什么时候使用线程,如何使用线程?
如果用书面语,那你还不如看书呵,还是通俗点。

线程:

举例:如果你开着QQ,需要和多人进行语音,那么,你邀请一位朋友进行连接,就需要开辟一条线程,用于保持连接和传递数据。它和进程不同,具体的内容可以网络下:线程和进程的区别。

使用:

一般会在同时触发多项任务时使用线程,比如服务器和客户端的连接,作为服务器,我需要接受多个客户端的访问,每个客户端的操作又都不一样,但都需要服务器去处理,那么作为服务器我会创建专属于该客户端的一个连接(一个线程去hold住它),通过互相传递指令去执行任务。

创建:

有2种方法:

推荐用:

public class TestRun implements Runnable{ 第一步实现Runnable接口

public TestRun(){

new Thread(this).start(); 第三步启动线程

}

public void run(){ 第二步实现run方法,该方法为接口中抽象方法

System.out.println("线程体");

}

}

Ⅱ C语言怎样实现多线程

packagecn.sdeit.file;
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.InputStream;
import历让java.io.InputStreamReader;
importjava.util.Scanner;
publicclassReadTxt
{
privateintid;
publicStringgetArticle(Stringpath,intid)
{
Stringurl=path+id+".txt";
Stringstring="";
StringallString="";
Filefile=newFile(url);
try
{
BufferedReaderreader=newBufferedReader(newInputStreamReader(newFileInputStream(file),"utf-8"并搭));
while((string=reader.readLine())!=null)
{
allString+=绝烂拿string+" ";
}
}catch(FileNotFoundExceptione)
{
e.printStackTrace();
}catch(IOExceptione)
{
e.printStackTrace();
}
returnallString;
}
}

Ⅲ C语言多线程如何实现

线程之间没有共享数据,不需要线程同步
你在主函数里面,把线程销毁的太快了,线程都没来得及执行完你就退出了,在创建完线程之后,加个sleep等待几秒再销毁线程。
同时注意一下,主进程退出的话,所有线程也会退出。

如果要准确的等待线程执行完再销毁,可以使用join方法或者共享标志位的方法

Ⅳ C语言能实现多线程么

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

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

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

Ⅳ c语言中怎样创建多线程

/*这是我写的最简单的多线程程序,看懂不?*/
#include <windows.h>
#include <stdio.h>
//#include <strsafe.h>

DWORD WINAPI ThreadProc1( LPVOID lpParam )
{

int i=0,j=0;
while(1)
{
printf("hello,this thread 1 ...\n");

//延时
for(i=0;i<200000000;i++)
{
;
}
}
}

DWORD WINAPI ThreadProc2( LPVOID lpParam )
{

int i=0,j=0;
while(1)
{
printf("hello,this thread 2 ...\n");

//延时
for(i=0;i<200000000;i++)
{
;
}
}
}

void main()
{
int i=0;
//创建线程1
CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc1, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier

//创建线程2
CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc2, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier

//让主线程进入循环,主线程若退出,子线程1,2会被系统“杀死”
while(1)
{
printf("hello,this thread 0 ...\n");

//延时
for(i=0;i<200000000;i++)
{;}

}
}

Ⅵ c语言如何编写一个简单的多线程程序

这是一个多线程例子,里面只有两个线程,是生产者/消费者模式,已编译通毁举宏过,注释很详细,x0dx0a如下:x0dx0ax0dx0a/* 以生答蠢产者和消费者模型问题来阐述Linux线程的控制和通信你 x0dx0a 生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。x0dx0a 缓冲区有N个,是一个环形的缓冲池。x0dx0a */纤册x0dx0a#include x0dx0a#include x0dx0ax0dx0a#define BUFFER_SIZE 16x0dx0ax0dx0astruct prodconsx0dx0a{x0dx0a int buffer[BUFFER_SIZE];/*实际存放数据的数组*/x0dx0a pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/x0dx0a int readpos,writepos; /*读写指针*/x0dx0a pthread_cond_t notempty;/*缓冲区非空的条件变量*/x0dx0a pthread_cond_t notfull;/*缓冲区未满 的条件变量*/x0dx0a};x0dx0ax0dx0a/*初始化缓冲区*/x0dx0avoid pthread_init( struct prodcons *p)x0dx0a{x0dx0a pthread_mutex_init(&p->lock,NULL);x0dx0a pthread_cond_init(&p->notempty,NULL);x0dx0a pthread_cond_init(&p->notfull,NULL);x0dx0a p->readpos = 0;x0dx0a p->writepos = 0;x0dx0a}x0dx0ax0dx0a/*将产品放入缓冲区,这里是存入一个整数*/x0dx0avoid put(struct prodcons *p,int data)x0dx0a{x0dx0a pthread_mutex_lock(&p->lock);x0dx0a /*等待缓冲区未满*/x0dx0a if((p->writepos +1)%BUFFER_SIZE ==p->readpos)x0dx0a {x0dx0a pthread_cond_wait(&p->notfull,&p->lock);x0dx0a }x0dx0a p->buffer[p->writepos] =data;x0dx0a p->writepos++;x0dx0a if(p->writepos >= BUFFER_SIZE)x0dx0a p->writepos = 0;x0dx0a pthread_cond_signal(&p->notempty);x0dx0a pthread_mutex_unlock(&p->lock);x0dx0a}x0dx0a/*从缓冲区取出整数*/x0dx0aint get(struct prodcons *p)x0dx0a{x0dx0a int data;x0dx0a pthread_mutex_lock(&p->lock);x0dx0a /*等待缓冲区非空*/x0dx0a if(p->writepos == p->readpos)x0dx0a {x0dx0a pthread_cond_wait(&p->notempty ,&p->lock);//非空就设置条件变量notemptyx0dx0a }x0dx0a /*读书据,移动读指针*/x0dx0a data = p->buffer[p->readpos];x0dx0a p->readpos++;x0dx0a if(p->readpos == BUFFER_SIZE)x0dx0a p->readpos = 0;x0dx0a /*设置缓冲区未满的条件变量*/x0dx0a pthread_cond_signal(&p->notfull);x0dx0a pthread_mutex_unlock(&p->lock);x0dx0a return data;x0dx0a}x0dx0a /*测试:生产站线程将1 到1000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/x0dx0a#define OVER (-1)x0dx0astruct prodcons buffer;x0dx0avoid *procer(void *data)x0dx0a{x0dx0a int n;x0dx0a for( n=0;n<1000;n++)x0dx0a {x0dx0a printf("%d ------>\n",n);x0dx0a put(&buffer,n);x0dx0a }x0dx0a put(&buffer,OVER);x0dx0a return NULL;x0dx0a}x0dx0avoid *consumer(void *data)x0dx0a{x0dx0a int d;x0dx0a while(1)x0dx0a {x0dx0a d = get(&buffer);x0dx0a if(d == OVER)x0dx0a break;x0dx0a elsex0dx0a printf("----->%d\n",d);x0dx0a }x0dx0a return NULL;x0dx0a}x0dx0aint main()x0dx0a{x0dx0a pthread_t th_p,th_c;x0dx0a void *retval;x0dx0a pthread_init(&buffer);x0dx0a pthread_create(&th_p,NULL,procer,0);x0dx0a pthread_create(&th_c,NULL,consumer,0);x0dx0a /*等待两个线程结束*/x0dx0a pthread_join(th_p, &retval);x0dx0a pthread_join(th_c,&retval);x0dx0a return 0;x0dx0a}

Ⅶ C语言编的程序如何实现多线程运行

unix或linux下可以包含pthread.h头文陵雹告件
使用pthread_create 函数来创建一个尺明线程
int pthread_create (pthread_t *, const pthread_attr_t *,
void *(*)(void *), void *);

windows下也有windows api可以实现肆仔

Ⅷ 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语言怎样实现多线程

首先你要有控制蛇移动方向的全局变量(定义在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语言中怎样创建多线程

/*这是我写的最简单的多线程程序,看懂唤蚂不?*/x0dx0a#include x0dx0a#include x0dx0a//#include x0dx0ax0dx0aDWORD WINAPI ThreadProc1( LPVOID lpParam ) x0dx0a{x0dx0ax0dx0a int i=0,j=0;x0dx0a while(1)x0dx0a {x0dx0a printf("hello,this thread 1 ...\n");x0dx0a x0dx0a //延时x0dx0a for(i=0;i<200000000;i++)x0dx0a {x0dx0a ;x0dx0a }x0dx0a }x0dx0a} x0dx0ax0dx0aDWORD WINAPI ThreadProc2( LPVOID lpParam ) x0dx0a{x0dx0ax0dx0a int i=0,j=0;x0dx0a while(1)x0dx0a {x0dx0a printf("hello,this thread 2 ...\n");x0dx0a x0dx0a //延时x0dx0a for(i=0;i<200000000;i++)x0dx0a {x0dx0a ;x0dx0a }x0dx0a }x0dx0a} x0dx0ax0dx0avoid main()x0dx0a{x0dx0a int i=0;x0dx0a //创建线程1x0dx0a CreateThread( x0dx0a NULL, /悄派/ default security attributesx0dx0a 0, // use default stack size x0dx0a ThreadProc1, // thread function x0dx0a NULL, // argument to thread function x0dx0a 0, // use default creation flags x0dx0a NULL); // returns the thread identifier x0dx0ax0dx0a //创建线程2x0dx0a CreateThread( x0dx0a NULL, // default security attributesx0dx0a 0, // use default stack size x0dx0a ThreadProc2, // thread function x0dx0a NULL, /和运埋/ argument to thread function x0dx0a 0, // use default creation flags x0dx0a NULL); // returns the thread identifierx0dx0ax0dx0a //让主线程进入循环,主线程若退出,子线程1,2会被系统“杀死”x0dx0a while(1)x0dx0a {x0dx0a printf("hello,this thread 0 ...\n");x0dx0a x0dx0a //延时x0dx0a for(i=0;i<200000000;i++)x0dx0a {;}x0dx0ax0dx0a }x0dx0a}