当前位置:首页 » 编程软件 » linux多线程编译

linux多线程编译

发布时间: 2023-07-25 16:34:16

Ⅰ 陈硕 linux 多线程服务器编程 上的例子怎样编译

Linux多线程程序编译时记得加上一个-pthread的编译参数就可以了,不加这个参数就通不过。

Ⅱ linux多线程程序编译,需要包含库

gcc -o XXX -lthread
在最后加上-lthread

Ⅲ Linux下如何实现shell多线程编程以提高应用程序的响应

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多线程编程的实例介绍了,使用多线程编程还能够改善程序结构,有兴趣的朋友不妨试试看吧。

Ⅳ linux下c、c++下多线程编译

C语言要求除main函数外 所有的函数必须先声明才能使用 你可以在函数定义的时候一起声明这个函数 但是在这个函数定义之前不能使用这个函数
下面用通俗点的语言讲: 你在main函数中调用了thread函数, 但是如果你把void *thread(void *vargp);删掉了, 那么编译器就找不到这个函数了(因为编译器是从前往后编译这个程序的) 因此编译器是通不过的
有两种方法, 一种就是像你之前写的 先声明这个函数 第二种是把void *thread(void *vargp){...}放到main函数的前面.
有些返回值和参数类型为int型的函数也可以不用声明, 编译器也能通过, 不过这是不建议的 也是不符合标准的
标准建议每个函数都应该给出它们的显式的声明
希望你懂了 嘿嘿

Ⅳ Linux 多线程编程(二)2019-08-10

三种专门用于线程同步的机制:POSIX信号量,互斥量和条件变量.

在Linux上信号量API有两组,一组是System V IPC信号量,即PV操作,另外就是POSIX信号量,POSIX信号量的名字都是以sem_开头.

phshared参数指定信号量的类型,若其值为0,就表示这个信号量是当前进程的局部信号量,否则该信号量可以在多个进程之间共享.value值指定信号量的初始值,一般与下面的sem_wait函数相对应.

其中比较重要的函数sem_wait函数会以原子操作的方式将信号量的值减一,如果信号量的值为零,则sem_wait将会阻塞,信号量的值可以在sem_init函数中的value初始化;sem_trywait函数是sem_wait的非阻塞版本;sem_post函数将以原子的操作对信号量加一,当信号量的值大于0时,其他正在调用sem_wait等待信号量的线程将被唤醒.
这些函数成功时返回0,失败则返回-1并设置errno.

生产者消费者模型:
生产者对应一个信号量:sem_t procer;
消费者对应一个信号量:sem_t customer;
sem_init(&procer,2)----生产者拥有资源,可以工作;
sem_init(&customer,0)----消费者没有资源,阻塞;

访问公共资源前对互斥量设置(加锁),确保同一时间只有一个线程访问数据,在访问完成后再释放(解锁)互斥量.
互斥锁的运行方式:串行访问共享资源;
信号量的运行方式:并行访问共享资源;
互斥量用pthread_mutex_t数据类型表示,在使用互斥量之前,必须使用pthread_mutex_init函数对它进行初始化,注意,使用完毕后需调用pthread_mutex_destroy.

pthread_mutex_init用于初始化互斥锁,mutexattr用于指定互斥锁的属性,若为NULL,则表示默认属性。除了用这个函数初始化互斥所外,还可以用如下方式初始化:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER。
pthread_mutex_destroy用于销毁互斥锁,以释放占用的内核资源,销毁一个已经加锁的互斥锁将导致不可预期的后果。

pthread_mutex_lock以原子操作给一个互斥锁加锁。如果目标互斥锁已经被加锁,则pthread_mutex_lock则被阻塞,直到该互斥锁占有者把它给解锁.
pthread_mutex_trylock和pthread_mutex_lock类似,不过它始终立即返回,而不论被操作的互斥锁是否加锁,是pthread_mutex_lock的非阻塞版本.当目标互斥锁未被加锁时,pthread_mutex_trylock进行加锁操作;否则将返回EBUSY错误码。注意:这里讨论的pthread_mutex_lock和pthread_mutex_trylock是针对普通锁而言的,对于其他类型的锁,这两个加锁函数会有不同的行为.
pthread_mutex_unlock以原子操作方式给一个互斥锁进行解锁操作。如果此时有其他线程正在等待这个互斥锁,则这些线程中的一个将获得它.


三个打印机轮流打印:

输出结果:

如果说互斥锁是用于同步线程对共享数据的访问的话,那么条件变量就是用于在线程之间同步共享数据的值.条件变量提供了一种线程之间通信的机制:当某个共享数据达到某个值时,唤醒等待这个共享数据的线程.
条件变量会在条件不满足的情况下阻塞线程.且条件变量和互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生.

其中pthread_cond_broadcast函数以广播的形式唤醒所有等待目标条件变量的线程,pthread_cond_signal函数用于唤醒一个等待目标条件变量线程.但有时候我们可能需要唤醒一个固定的线程,可以通过间接的方法实现:定义一个能够唯一标识目标线程的全局变量,在唤醒等待条件变量的线程前先设置该变量为目标线程,然后采用广播的方式唤醒所有等待的线程,这些线程被唤醒之后都检查该变量以判断是否是自己.

采用条件变量+互斥锁实现生产者消费者模型:

运行结果:

阻塞队列+生产者消费者

运行结果:

Ⅵ 关于linux下多线程编程

pthread_join 线程停止等待函数没有调用

pthread_create 线程生成后,没有等子线程停止,主线程就先停止了。

主线程停止后,整个程序停止,子线程在没有printf的时候就被结束了。

结论:不是你没有看到结果,而是在子线程printf("..................\n");之前整个程序就已经停止了。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

#define FALSE -1
#define TRUE 0

void *shuchu( void *my )
{
int j;
printf("..................\n");
}
int main()
{
int i = 0;
int rc = 0;
int ret1;
pthread_t p_thread1;
if(0!=(ret1 = pthread_create(&p_thread1, NULL, shuchu, NULL)))printf("sfdfsdfi\n");
printf("[%d]\n",p_thread1);
pthread_join(p_thread1, NULL);
return TRUE;

}

Ⅶ Linux下如何实现shell多线程编程

程序代码test.c共两个线程,一个主线程,一个读缓存区的线程:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
char globe_buffer[100];

void *read_buffer_thread(void *arg); //这里先声明一下读缓存的线程,具体实现写在后面了

int main()
{
int res,i;
pthread_t read_thread;
for(i=0;i<20;i++)
globe_buffer[i]=i;
printf("\nTest thread : write buffer finish\n");
sleep(3);\\这里的3秒是多余,可以不要。
res = pthread_create(&read_thread, NULL, read_buffer_thread, NULL);
if (res != 0)
{
printf("Read Thread creat Error!");
exit(0);
}
sleep(1);
printf("waiting for read thread to finish...\n");

res = pthread_join(read_thread, NULL);
if (res != 0)
{
printf("read thread join failed!\n");
exit(0);
}
printf("read thread test OK, have fun!! exit ByeBye\n");
return 0;
}
void *read_buffer_thread(void *arg)
{
int i,x;
printf("Read buffer thread read data : \n");
for(i=0;i<20;i++)
{
x=globe_buffer[i];
printf("%d ",x);
globe_buffer[i]=0;//清空
}
printf("\nread over\n");
}
---------------------------------------------------------------------------------
以上程序编译:
gcc -D_REENTRANT test.c -o test.o –lpthread
运行这个程序:
$ ./test.o:

Ⅷ LINUX下多线程编译问题

你编译的时候有加多线程连接选项吗? 要加上 -lpthread 或者 -pthread (尽量选后者)
例如 gcc -pthread -o test main.cpp

另外你的线程创建的不对,函数指针不能强转类型(这里也不用转)
pthread_create(&procter_t,NULL,(void*)procter_f,NULL);
pthread_create(&consumer_t,NULL,(void*)consumer_f,NULL);

应该是
pthread_create(&procter_t,NULL,procter_f,NULL);
pthread_create(&consumer_t,NULL,consumer_f,NULL);

热点内容
学车网源码 发布:2025-02-06 05:47:40 浏览:385
搭建局域网影院服务器 发布:2025-02-06 05:47:38 浏览:759
广东一区cf刷经验房密码都是什么 发布:2025-02-06 05:46:20 浏览:633
加密工具源码 发布:2025-02-06 05:44:52 浏览:13
笔记本可用存储多大 发布:2025-02-06 05:44:48 浏览:157
ftp登录后没有反应 发布:2025-02-06 05:29:41 浏览:175
linux建目录命令 发布:2025-02-06 05:29:06 浏览:724
安卓所有照片在哪里 发布:2025-02-06 05:16:32 浏览:972
l2缓存作用 发布:2025-02-06 05:15:02 浏览:291
快播为什么连接不了服务器 发布:2025-02-06 05:12:51 浏览:386