boost c++ lib on linux(3) - thread库的使用初学

今天学习了一下boost thread库的使用,只是粗浅的学习了怎么使用boost thread的库函数构建多线程的c++程序,了解了基本的thread创建,线程同步以及线程本地存储的使用。都在一个代码实例中进行了 验证。其中还有一个条件变量的使用在不好在一个代码中实现,以后有时间在编写验证一下。

源代码

/*************************************************************************
    > File Name: thread_demo.cpp
    > Author: Liu Xin
    > Mail: liu_x_0625@126.com 
    > Created Time: 2012年10月14日 星期日 10时54分46秒
 ************************************************************************/

#include<iostream>
#include<sstream>
#include<boost/thread/thread.hpp>
#include<boost/thread/mutex.hpp>
#include<boost/bind.hpp>
#include<boost/thread/tss.hpp>

using namespace std;

const int MAX_THREAD_NUM=5;

int gCount=0;
boost::mutex mutex;
boost::mutex io_mutex;
boost::thread_specific_ptr<string> ptr; // 线程本地存储访问

void hello(int iThreadId)
{
	// 这两个cout语句在多线程的时候还是汇出现io争用的情况,出现打印混乱, 所以要加锁
	{
		boost::mutex::scoped_lock lock(io_mutex);
		std::cout << "thread " << iThreadId << ": " << 
			"hello world boost thread." 
			<< std::endl;
		std::cout << "thread " << iThreadId << ": " << 
			"oh~, I am a little tired, give me 10 seconds, sleeping zzzzz..." 
			<< std::endl;
	}

	ptr.reset(new string("hello"));

	for(int i=0; i<10; i++)
	{
		{
			boost::mutex::scoped_lock lock(mutex);

			stringstream ss;
			ss << iThreadId;
			(*ptr) = "thread id: " + ss.str();
			std::cout << (*ptr) << std::endl;

			std::cout << "global count: " << ++gCount << std::endl;

		}
		sleep(1);
	}
}

int main()
{
	boost::thread* ths[MAX_THREAD_NUM]={NULL};
	for (int i=0; i<MAX_THREAD_NUM; i++)
	{
		ths[i] = new boost::thread(boost::bind(&hello, i+1));
	}

	for (int i=0; i<MAX_THREAD_NUM; i++)
	  ths[i]->join();
	
	std::cout << "thread all finished." << std::endl;
	return 0;
}

说明

1、代码实现了一个线程函数,main函数中创建多个线程对象调用该线程函数,并等待每个线程结束
2、线程函数中先输出两行文字,因为io输出是争用资源,需要加锁,否则会出现打印混乱
3、在for循环中,对共享资源gCount进行++操作,同时输出到标准输出中,也许要进行互斥体加锁
4、加锁mutex根据RAII实现,也就是scope_lock,退出{}则自动解锁,因此,此处sleep放在{}外面 是为了验证多线程执行++gCount操作是真正的多线程。如果放在{}里面的话,由于lock还未释放,其他线程会一直等到本线程的for循环执行完成才获得锁,实际上变成了伪多线程了,无意义
5、boost::thread_specific_ptr是线程本地存储的访问 指针,用于验证线程本地存储的效果

编译:

configure.in
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.68])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([thread_demo.cpp])
#AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE

# Checks for programs.
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT([Makefile])

Makefile.am
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=thread_demo
thread_demo_SOURCES=thread_demo.cpp
INCLUDES=-I/usr/local/boost_1_50_0/
LDADD=/usr/local/lib/libboost_thread.so
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页