为您找到与Linux多线程服务器端编程相关的共200个结果:
Linux中多线程编程拥有提高应用程序的响应、使多cpu系统更加有效等优点,下面读文网小编将通过Linux下shell多线程编程的例子给大家讲解下多线程编程的过程,一起来了解下吧。
#!/bin/bash
#———————————————————————————–
# 此例子说明了一种用wait、read命令模拟多线程的一种技巧
# 此技巧往往用于多主机检查,比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况
# 还说明了多线程的控制
#———————————————————————————–
function a_sub
{
# 此处定义一个函数,作为一个线程(子进程)
sleep 3 # 线程的作用是sleep 3s
}
tmp_fifofile=“/tmp/$.fifo” mkfifo $tmp_fifofile # 新建一个fifo类型的文件
exec 6《》$tmp_fifofile # 将fd6指向fifo类型
rm $tmp_fifofile thread=15 # 此处定义线程数
for
((i=0;i《$thread;i++));do echo
done 》&6 # 事实上就是在fd6中放置了$thread个回车符
for
((i=0;i《50;i++));do # 50次循环,可以理解为50个主机,或其他
read -u6 # 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
# fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
{ # 此处子进程开始执行,被放到后台
a_sub &&
{ # 此处可以用来判断子进程的逻辑
echo “a_sub is finished”
}
||
{ echo “sub error”
}
echo 》&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
}
& done wait # 等待所有的后台子进程结束
exec 6》&- # 关闭df6 exit 0
说明:
此程序中的命令
mkfifo tmpfile
和linux中的命令
mknod tmpfile p
效?果相同。区别是mkfifo为POSIX标准,因此推荐使用它。该命令创建了一个先入先出的管道文件,并为其分配文件标志符6。管道文件是进程之间通信的一种方式,注意这一句很重要
exec 6《》$tmp_fifofile # 将fd6指向fifo类型
如果没有这句,在向文件$tmp_fifofile或者&6写入数据时,程序会被阻塞,直到有read读出了管道文件中的数据为止。而执行了上面这一句后就可以在程序运行期间不断向fifo类型的文件写入数据而不会阻塞,并且数据会被保存下来以供read程序读出。
通过运行命令:
time 。/multithread.sh 》/dev/null
最终运算时间: 50/15 = 3组(每组15)+1组(5个《15 组成一个组)= 4组,每组花费时间:3秒,
则 3 * 4 = 12 秒。
传统非多线程的代码 运算时间: 50 * 3 = 150 秒。
上面就是Linux下shell多线程编程的实例介绍了,使用多线程编程还能够改善程序结构,有兴趣的朋友不妨试试看吧。
浏览量:2
下载量:0
时间:
OpenMP是一种多处理器多线程的编程语言,能够支持多个平台,包括Linux系统,那么Linux下要如何进行openmp多线程编程呢?一起来和读文网小编了解下吧。
代码如下:
#inlcude 《omp.h》
#pragma omp parallel for
#pragma omp for reduction(+: 变量)
#pragma omp critical//锁
{
}
#pragma omp parallel for private(x,y)//每个线程都独立拷贝x, y变量,互不干扰,如果不设默认是共享变量
#pragma omp parallel for schedule(static/dynamic/guided, k)//总工作量划分成n/k块,再多线程调度
#pragma omp parallel sections
{
#pragma omp section//要保证几个section下的函数之间没有变量依赖
。。。。。。。。。
#pragma omp section
。。。。。。。。。
}
#pragma omp parallel
{
。。。。。。。();
#pragma omp master/single //保证只有主线程/某个线程能访问下面的函数,区别是使用master没有barrier珊障,single的话先完成的线程等待没完成的线程
{
}
。。。。。。。
}《/p》 《p》#pragma omp barrier/nowait //强制设置珊障/无需等待,如果后续函数对前面的多线程没有依赖,即可使用nowait
#pragma omp parallel for firstprivate(变量)/lastprivate(变量) //为每个多线程赋初值/出多线程回到主线程时赋值供主线程使用
还有就是OpenMP的API:
代码如下:
int omp_get_num_threads(); //获取当前使用的线程个数
int omp_get_num_threads(2/3/。。。)//设置要使用的线程个数
nt omp_get_thread_num(void);//返回当前线程号
int omp_get_num_procs(void);//返回可用的处理核个数
ubuntu下,无需加《omp.h》头文件,只需在编译的时候增添-fopenmp即可。
例如:emacs操作命令如下
代码如下:
emacs omp.c《/p》 《p》#include 《stdio.h》
int main()
{
int rank, size;
#pragma omp parallel num_thread(3) private(rank) //num_threads用来控制线程数量
//或者使用omp_set_num_threads(3);《/p》 《p》 {
rank = omp_get_thread_num();
size = omp_get_num_threads();
printf(“using %d of %d now.”, rank, size);
}
return 0;
}《/p》 《p》ctrl+x s
alt+x compile
gcc -fopenmp -o omp omp.c
alt+shift+1 。/omp
上面就是Linux下实现OpenMP多线程编程的方法介绍了,本文主要通过一个实例来给大家讲解OpenMP多线程编程,如果还想了解更多的相关知识,不妨多多关注本站吧。
浏览量:2
下载量:0
时间:
今天就有读者问读文网小编我了,Linux网络编程怎么使用多进程实现服务器并发访问?然后读文网小编我通过查阅相关资料后,就把相关的解决方法分享到这里吧,以下就是具体内容:
采用多进程的方式实现服务器的并发访问的经典范例。
viidiot@ubuntu$ ./discli 127.0.0.1
hello,world!(客户端输入的内容)
hello,world!(服务器端返回的内容)
浏览量:3
下载量:0
时间:
由于很多读者都不清楚Linux网络编程socket,那么这里就由读文网小编为大家介绍一下Linux网络编程socket吧:
建立套接字socket()--->与服务器建立连接connect()
详细代码如下:
代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
int sockfd; char buf[1024];
struct sockaddr_in srvaddr;
struct hostent *phost; int nbytes;
if(argc!=3){
fprintf(stderr,"Usage:%s a",argv[0]);
exit(1);
}
/* 客户程序开始建立 sockfd描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
fprintf(stderr,"socket Error:%sa",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&srvaddr,sizeof(srvaddr));
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(atoi(argv[2]));
if (inet_pton(AF_INET, argv[1], &srvaddr.sin_addr) <= 0){
fprintf(stderr,"inet_pton Error:%sa",strerror(errno));
exit(1);
}
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&srvaddr),sizeof(struct sockaddr))==-1){
fprintf(stderr,"connect Error:%sa",strerror(errno));
exit(1);
}
/* 连接成功了 */
if((nbytes=read(sockfd,buf,1024))==-1){
fprintf(stderr,"read Error:%s",strerror(errno));
exit(1);
}
buf[nbytes]='