C语言怎样实现多线程

C语言怎样实现多线程,第1张

package cnsdeitfile;

import javaioBufferedReader;

import javaioFile;

import javaioFileInputStream;

import javaioFileNotFoundException;

import javaioIOException;

import javaioInputStream;

import javaioInputStreamReader;

import javautilScanner;

public class ReadTxt

{

private int id;

public String getArticle(String path,int id)

{

String url = path+id+"txt";

String string = "";

String allString = "";

File file=new File(url);

try

{

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8"));

while((string=readerreadLine())!=null)

{

allString += string+"\r\n";

}

} catch (FileNotFoundException e)

{

eprintStackTrace();

} catch (IOException e)

{

eprintStackTrace();

}

return allString;

}

}

线程之间没有共享数据,不需要线程同步

你在主函数里面,把线程销毁的太快了,线程都没来得及执行完你就退出了,在创建完线程之后,加个sleep等待几秒再销毁线程。

同时注意一下,主进程退出的话,所有线程也会退出。

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

1、使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。然后这个Beep()的需求要进行线程间通信,可以用共享内存的方法,设一个bool变量flag共享,然后beep的时候设为false,beep完设成true。fun()里面每次看一下这个flag,是false的话就不做动作等下一秒,基本可以满足需求。

2、例程:

#include <pthreadh>

#include <stdioh>

#include <sys/timeh>

#include <stringh>

#define MAX 10

pthread_t thread[2];

pthread_mutex_t mut;

int number=0, i;

void thread1()

{

printf ("thread1 : I'm thread 1\n");

for (i = 0; i < MAX; i++)

{

printf("thread1 : number = %d\n",number);

pthread_mutex_lock(&mut);

number++;

pthread_mutex_unlock(&mut);

sleep(2);

}

printf("thread1 :主函数在等我完成任务吗?\n");

pthread_exit(NULL);

}

void thread2()

{

printf("thread2 : I'm thread 2\n");

for (i = 0; i < MAX; i++)

{

printf("thread2 : number = %d\n",number);

pthread_mutex_lock(&mut);

number++;

pthread_mutex_unlock(&mut);

sleep(3);

}

printf("thread2 :主函数在等我完成任务吗?\n");

pthread_exit(NULL);

}

void thread_create(void)

{

int temp;

memset(&thread, 0, sizeof(thread)); //comment1

/创建线程/

if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2

printf("线程1创建失败!\n");

else

printf("线程1被创建\n");

if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3

printf("线程2创建失败");

else

printf("线程2被创建\n");

}

void thread_wait(void)

{

/等待线程结束/

if(thread[0] !=0) { //comment4

pthread_join(thread[0],NULL);

printf("线程1已经结束\n");

}

if(thread[1] !=0) { //comment5

pthread_join(thread[1],NULL);

printf("线程2已经结束\n");

}

}

int main()

{

/用默认属性初始化互斥锁/

pthread_mutex_init(&mut,NULL);

printf("我是主函数哦,我正在创建线程,呵呵\n");

thread_create();

printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");

thread_wait();

return 0;

}

1、epoll处理并发事件,多线程处理并发业务。

2、poll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

#include<stdioh>

#include<stdlibh>

#include<windowsh>

DWORD WINAPI ThreadProc(LPVOID lpParam)

{

int pt=(int)lpParam;

printf("I am tread %d\r\n",pt);

}

int main()

{

const int Count=4;

int datas[Count];

DWORD dwThreadId[Count];

HANDLE hThread[Count];

int i;

for(i=0;i<Count;i++)

{

datas[i]=i+1;

hThread[i]=CreateThread(NULL,0,ThreadProc,&datas[i],0,&dwThreadId[i]);

}

WaitForMultipleObjects(Count,hThread,TRUE,INFINITE);

for(i=0;i<Count;i++)

{

CloseHandle(hThread[i]);

}

system("PAUSE");

return EXIT_SUCCESS;

}

进程的生命周期:[1]创建 --- fork [2]执行 --- a execb子进程实现代码逻辑[3]结束 --- exit _exit僵尸态进程---wait waitpid孤儿进程--------------------------------------进程存在的问题:(1)进程的创建 --- 复制(时间 和 空间的开销很大)(2)进程的运行 --- 调度-->

pthread_create创建一个线程,thread是用来表明创建线程的ID,attr指出线程创建时候的属性,我们用NULL来表明使用缺省属性。start_routine函数指针是线程创建成功后开始执行的函数,arg是这个函数的唯一一个参数。表明传递给start_routine的参数。

pthread_exit函数和exit函数类似用来退出线程这个函数结束线程,释放函数的资源,并在最后阻塞,直到其他线程使用pthread_join函数等待它。然后将retval的值传递给thread_return由于这个函数释放所以的函数资源,所以retval不能够指向函数的局部变量。

pthread_join和wait调用一样用来等待指定的线程。下面我们使用一个实例来解释一下使用方法在实践中,我们经常要备份一些文件。下面这个程序可以实现当前目录下的所有文件备份。

以上就是关于C语言怎样实现多线程全部的内容,包括:C语言怎样实现多线程、C语言多线程如何实现、用C语言如何实现多线程同时运行的情况下,各个线程输出不同的随机数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9521325.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存