bool linux linux盒子
各位老铁们,大家好,今天由我来为大家分享bool linux,以及linux盒子的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
linux下安装和使用tbb
线程构建模块(TBB)使您可以轻松编写并行C++程序,这些程序可充分利用多核性能,可移植且可组合,并具有面向未来的可扩展性。
广泛用于任务并行的C++模板库。
并行算法和数据结构,可扩展的内存分配和任务调度。
丰富的通用并行功能集,C++; Windows*,Linux*,OS X*和其他操作系统
选择一个稳定版本即可,我用的是tbb-2018_U3
tar-zxvf tbb-2018_U3.tar.gz
cd tbb-2018_U3
make
我的编译器未报错
若编译期间报出以下错误:
/tmp/ccxNhOc9.s: Assembler messages:
/tmp/ccxNhOc9.s:615: Error: no such instruction: `xtest'
/tmp/ccxNhOc9.s:643: Error: no such instruction: `xabort$255'
/tmp/ccxNhOc9.s:652: Error: no such instruction: `xabort$255'
/tmp/ccxNhOc9.s:658: Error: no such instruction: `xend'
/tmp/ccxNhOc9.s:825: Error: no such instruction: `xbegin.L56'
/tmp/ccxNhOc9.s:988: Error: no such instruction: `xbegin.L71'
/tmp/ccxNhOc9.s:1216: Error: no such instruction: `xabort$255'
make[1]:*** [x86_rtm_rw_mutex.o] Error 1
make[1]:*** Waiting for unfinished jobs....
make[1]: Leaving directory `/user_data/.tmp/linux_intel64_gcc_cc4.9.1_libc2.12_kernel2.6.32_debug'
make:*** [tbb] Error 2
则表明当前的gcc编译器不支持-mrtm。则可行的方案是注释以下几行。打开tbb目录build/linux.gcc.inc文件,注释以下几行。
# gcc 4.8 and later support RTM intrinsics, but require command line switch to enable them
ifneq(,$(shell gcc-dumpversion| egrep "^4\.[8-9]"))
RTM_KEY=-mrtm
#endif
cd build
chmod+x*.sh
sh generate_tbbvars.sh
sh tbbvars.sh
cd linux_intel64_gcc_你的版本_release
cp*.so/usr/lib64
cp*.so.2/usr/lib64
ldconfig
//回到解压缩目录下
cp-r include/*/usr//include
//进入解压目录下的examples目录
make
经过一段时间运行如下说明测试通过
serial run time= 0.21682
parallel run time= 0.0694263
elapsed time: 0.444736 seconds
make[1]: Leaving directory `/home/heweiwei/test/tbb-2018_U3/examples/pipeline/square'
------------------------ test_all/fibonacci/all------------------------
make-C test_all/fibonacci -f Makefile all CXX="g++"
make[1]: Entering directory `/home/heweiwei/test/tbb-2018_U3/examples/test_all/fibonacci'
g++-O2-DNDEBUG -m64-L/home/heweiwei/test/tbb-2018_U3/examples/../build/linux_intel64_gcc_cc4.8.5_libc2.17_kernel3.10.0_release-L/home/heweiwei/test/tbb-2018_U3/examples/../build/linux_intel64_gcc_cc4.8.5_libc2.17_kernel3.10.0_debug-o fibonacci Fibonacci.cpp-ltbb-lpthread-lrt-lrt
./fibonacci
TEST PASSED
make[1]: Leaving directory `/home/heweiwei/test/tbb-2018_U3/examples/test_all/fibonacci'
#include<tbb/tbb.h>
#include<iostream>
using namespace std;
using namespace tbb;
int main()
{
int i= 0;
concurrent_queue<int> s_tbb_queue;
for(i= 10; i< 15; i++)
{
s_tbb_queue.push(i);
}
concurrent_queue<int>::iterator iter;
for(iter= s_tbb_queue.unsafe_begin(); iter!= s_tbb_queue.unsafe_end(); iter++)
{
cout<<"value="<<*iter<<endl;
}
cout<<"queue_size="<<s_tbb_queue.unsafe_size()<<endl;
int tmp= 0;
bool res= 0;
for(i= 0; i< 8; i++)
{
res= s_tbb_queue.try_pop(tmp);
if(res)
{
cout<<"pop_value="<<tmp<<endl;
}
else
{
cout<<"queue is empty"<<endl;
}
}
cout<<"queue_size="<<s_tbb_queue.unsafe_size()<<endl;
return 0;
}
运行
[heweiwei@heweiwei tbb_test]$./a.out
value=10
value=11
value=12
value=13
value=14
queue_size=5
pop_value=10
pop_value=11
pop_value=12
pop_value=13
pop_value=14
queue is empty
queue is empty
queue is empty
queue_size=0
浅谈linux 多线程编程和 windows 多线程编程的异同
转载自fychit创意空间很早以前就想写写linux下多线程编程和windows下的多线程编程了,但是每当写时又不知道从哪个地方写起,怎样把自己知道的东西都写出来,下面我就谈谈linux多线程及线程同步,并将它和windows的多线程进行比较,看看他们之间有什么相同点和不同的地方。
其实最开始我是搞windows下编程的,包括windows编程,windows驱动,包括usb驱动,ndis驱动,pci驱动,1394驱动等等,同时也一条龙服务,做windows下的应用程序开发,后面慢慢的我又对linux开发产生比较深的兴趣和爱好,就转到搞linux开发了。在接下来的我还会写一些博客,主要是写linux编程和windows编程的区别吧,现在想写的是linux下usb驱动和windows下usb驱动开发的区别,这些都是后话,等我将linux多线程和windows多线程讲解完后,我再写一篇usb驱动,谈谈windows和linux usb驱动的东东。好了,言归正传。开始将多线程了。
首先我们讲讲为什么要采用多线程编程,其实并不是所有的程序都必须采用多线程,有些时候采用多线程,性能还没有单线程好。所以我们要搞清楚,什么时候采用多线程。采用多线程的好处如下:
(1)因为多线程彼此之间采用相同的地址空间,共享大部分的数据,这样和多进程相比,代价比较节俭,因为多进程的话,启动新的进程必须分配给它独立的地址空间,这样需要数据表来维护代码段,数据段和堆栈段等等。
(2)多线程和多进程相比,一个明显的优点就是线程之间的通信了,对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。但是对于多线程就不一样了。他们之间可以直接共享数据,比如最简单的方式就是共享全局变量。但是共享全部变量也要注意哦,呵呵,必须注意同步,不然后果你知道的。呵呵。
(3)在多cpu的情况下,不同的线程可以运行不同的cpu下,这样就完全并行了。
反正我觉得在这种情况下,采用多线程比较理想。比如说你要做一个任务分2个步骤,你为提高工作效率,你可以多线程技术,开辟2个线程,第一个线程就做第一步的工作,第2个线程就做第2步的工作。但是你这个时候要注意同步了。因为只有第一步做完才能做第2步的工作。这时,我们可以采用同步技术进行线程之间的通信。
针对这种情况,我们首先讲讲多线程之间的通信,在windows平台下,多线程之间通信采用的方法主要有:
(1)共享全局变量,这种方法是最容易想到的,呵呵,那就首先讲讲吧,比如说吧,上面的问题,第一步要向第2步传递收据,我们可以之间共享全局变量,让两个线程之间传递数据,这时主要考虑的就是同步了,因为你后面的线程在对数据进行操作的时候,你第一个线程又改变了数据的内容,你不同步保护,后果很严重的。你也知道,这种情况就是读脏数据了。在这种情况下,我们最容易想到的同步方法就是设置一个bool flag了,比如说在第2个线程还没有用完数据前,第一个线程不能写入。有时在2个线程所需的时间不相同的时候,怎样达到最大效率的同步,就比较麻烦了。咱们可以多开几个缓冲区进行操作。就像生产者消费者一样了。如果是2个线程一直在跑的,由于时间不一致,缓冲区迟早会溢出的。在这种情况下就要考虑了,是不让数据写入还是让数据覆盖掉老的数据,这时候就要具体问题具体分析了。就此打住,呵呵。就是用bool变量控制同步,linux和windows是一样的。
既然讲道了这里,就再讲讲其它同步的方法。同样针对上面的这个问题,共享全局变量同步问题。除了采用bool变量外,最容易想到的方法就是互斥量了。呵呵,也就是传说中的加锁了。windows下加锁和linux下加锁是类似的。采用互斥量进行同步,要想进入那段代码,就先必须获得互斥量。
linux上互斥量的函数是:
windows下互斥量的函数有:createmutex创建一个互斥量,然后就是获得互斥量waitforsingleobject函数,用完了就释放互斥量ReleaseMutex(hMutex),当减到0的时候内核会才会释放其对象。下面是windows下与互斥的几个函数原型。
HANDLE WINAPI CreateMutex(
__in LPSECURITY_ATTRIBUTES lpMutexAttributes,
__in BOOL bInitialOwner,
__in LPCTSTR lpName
);
可以可用来创建一个有名或无名的互斥量对象
第一参数可以指向一个结构体SECURITY_ATTRIBUTES一般可以设为null;
第二参数指当时的函数是不是感应感应状态 FALSE为当前拥有者不会创建互斥
第三参数指明是否是有名的互斥对象如果是无名用null就好。
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);
第一个是创建的互斥对象的句柄。第二个是表示将在多少时间之后返回如果设为宏INFINITE则不会返回直到用户自己定义返回。
对于linux操作系统,互斥也是类似的,只是函数不同罢了。在linux下,和互斥相关的几个函数也要闪亮登场了。
pthread_mutex_init函数:初始化一个互斥锁;
pthread_mutex_destroy函数:注销一个互斥锁;
pthread_mutex_lock函数:加锁,如果不成功,阻塞等待;
pthread_mutex_unlock函数:解锁;
pthread_mutex_trylock函数:测试加锁,如果不成功就立即返回,错误码为EBUSY;
至于这些函数的用法,google上一搜,就出来了,呵呵,在这里不多讲了。windows下还有一个可以用来保护数据的方法,也是线程同步的方式
就是临界区了。临界区和互斥类似。它们之间的区别是,临界区速度快,但是它只能用来同步同一个进程内的多个线程。临界区的获取和释放函数如下:
EnterCriticalSection()进入临界区; LeaveCriticalSection()离开临界区。对于多线程共享内存的东东就讲到这里了。
(2)采用消息机制进行多线程通信和同步,windows下面的的消息机制的函数用的多的就是postmessage了。Linux下的消息机制,我用的较少,就不在这里说了,如果谁熟悉的,也告诉我,呵呵。
(3)windows下的另外一种线程通信方法就是事件和信号量了。同样针对我开始举得例子,2个线程同步,他们之间传递信息,可以采用事件(Event)或信号量(Semaphore),比如第一个线程完成生产的数据后,就必须告诉第2个线程,他已经把数据准备好了,你可以来取走了。第2个线程就把数据取走。呵呵,这里可以采用消息机制,当第一个线程准备好数据后,就直接postmessage给第2个线程,按理说采用postmessage一个线程就可以搞定这个问题了。呵呵,不是重点,省略不讲了。
对于linux,也有类似的方法,就是条件变量了,呵呵,这里windows和linux就有不同了。要特别讲讲才行。
对于windows,采用事件和信号量同步时候,都会使用waitforsingleobject进行等待的,这个函数的第一个参数是一个句柄,在这里可以是Event句柄,或Semaphore句柄,第2个参数就是等待的延迟,最终等多久,单位是ms,如果这个参数为INFINITE,那么就是无限等待了。释放信号量的函数为ReleaseSemaphore();释放事件的函数为SetEvent。当然使用这些东西都要初始化的。这里就不讲了。Msdn一搜,神马都出来了,呵呵。神马都是浮云!
对于linux操作系统,是采用条件变量来实现类似的功能的。Linux的条件变量一般都是和互斥锁一起使用的,主要的函数有:
pthread_mutex_lock,
pthread_mutex_unlock,
pthread_cond_init
pthread_cond_signal
pthread_cond_wait
pthread_cond_timewait
linux命令删除非空目录
【问题】怎样删除一个非空目录,及其目录里面所有内容:
【解答1】如果不进行递归删除。你可以使用API函数SHFileOperation,它可以一次删除目录及其下面的子目录和文件。
示例代码:
BOOL DelTree(LPCTSTR lpszPath)
{
SHFILEOPSTRUCT FileOp;
FileOp.fFlags= FOF_NOCONFIRMATION;
FileOp.hNameMappings= NULL;
FileOp.hwnd= NULL;
FileOp.lpszProgressTitle= NULL;
FileOp.pFrom= lpszPath;
FileOp.pTo= NULL;
FileOp.wFunc= FO_DELETE;
return SHFileOperation(&FileOp)== 0;
}
【解答2】使用递归调用,逐个删除:
示例代码:
BOOL DeleteDirectory(char*DirName)//如删除 DeleteDirectory("c:\\aaa")
{
CFileFind tempFind;
char tempFileFind[MAX_PATH];
sprintf(tempFileFind,"%s\\*.*",DirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
char foundFileName[MAX_PATH];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));
if(tempFind.IsDirectory())
{
char tempDir[MAX_PATH];
sprintf(tempDir,"%s\\%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
char tempFileName[MAX_PATH];
sprintf(tempFileName,"%s\\%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(DirName))
{
MessageBox(0,"删除目录失败!","警告信息",MB_OK);//比如没有找到文件夹,删除失败,可把此句删除
return FALSE;
}
return TRUE;
}