linux下多线程简单应用

1.环境配置

包含头文件#include时,在linux下编译多线程时,总是会报这样的错

:对‘pthread_create’未定义的引用

使用在CMakeLists.txt中链接到相关库即可

find_package(Threads REQUIRED)
if(THREADS_HAVE_PTHREAD_ARG)
  set_property(TARGET my_app PROPERTY COMPILE_OPTIONS "-pthread")
  set_property(TARGET my_app PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread")
endif()
if(CMAKE_THREAD_LIBS_INIT)
  target_link_libraries(my_app "${CMAKE_THREAD_LIBS_INIT}")
endif()

参考http://www.itkeyword.com/doc/1866142651042956x118/cmake-linux
2.实践练习,找到了一份学习多线程很不错的博客

c++11多线程编程(一):创建线程的三种方法
https://blog.csdn.net/lijinqi1987/article/details/78396512

c++11多线程编程(二):joining和detaching 线程
https://blog.csdn.net/lijinqi1987/article/details/78396758

c++11多线程编程(三):仔细地将参数传递给线程
https://blog.csdn.net/lijinqi1987/article/details/78404092
第三部分中,指定一个类的成员函数的指针作为线程函数是orbslam中经常用到的
具体的使用方法为

#include
#include

class DummyClass{
public:
	DummyClass(){}
	DummyClass(const DummyClass& obj){ }
	void sampleMemberfunction(int x)
	{
		std::cout<<"Inside sampleMemberfunction "<

c++11多线程编程(四):数据共享和竞争条件
https://blog.csdn.net/lijinqi1987/article/details/78405623
这里面的程序的第34行有一个小错误,应该把“==” 改为“=”

if ((val = testMultithreadWallet()) != 5000)

运行这里面的程序结果如下,发现每次运行的结果都有区别,与题主说的现象相符合,不过不知道为啥,我的结果出来的都是4000元

jlm@jlm-X450VE:~/桌面/build$ ./Test 
Error at count = 945 Money in Wallet = 4000
Error at count = 961 Money in Wallet = 4000
jlm@jlm-X450VE:~/桌面/build$ ./Test 
Error at count = 983 Money in Wallet = 4000
jlm@jlm-X450VE:~/桌面/build$ ./Test 
jlm@jlm-X450VE:~/桌面/build$ ./Test 
jlm@jlm-X450VE:~/桌面/build$ ./Test 
Error at count = 119 Money in Wallet = 4000
Error at count = 448 Money in Wallet = 4000

c++11多线程编程(五):使用mutex修复竞争
https://blog.csdn.net/lijinqi1987/article/details/78412183
这里面的最后一段代码的第10行的mMoney应该改为money
文章内容简介

//第一种修复竞争方法
  std::mutex mutex;
  {
  	mutex.lock();
  	fun();
  	mutex.unlock();
  }
  //第二种修复方法
  {
  	std::lock_guard lockGuard(mutex)
  	fun();
  }

第二种方法较第一种较好一点,因为不仅能够在大括号运行结束自动解锁,还能在大括号内部发生异常时解锁,下面介绍从别的地方学来的更好的一种方法std::unique_lock,然而现在还并没有看明白,今天先看到这儿把

你可能感兴趣的:(C++)