网站开发背景图模板,京东商城网站,有服务器怎么做网站,中间商网站怎么做大多数函数都不是可重入的。这也就是说在某一个线程已经调用了一个函数时#xff0c;如果你再调用同一个函数#xff0c;那么这样是不安全的。一个不可重入的函数通过连续的调用来保存静态变量或者是返回一个指向静态数据的指针。 举例来说#xff0c;std::strtok就是不可重…大多数函数都不是可重入的。这也就是说在某一个线程已经调用了一个函数时如果你再调用同一个函数那么这样是不安全的。一个不可重入的函数通过连续的调用来保存静态变量或者是返回一个指向静态数据的指针。 举例来说std::strtok就是不可重入的因为它使用静态变量来保存要被分割成符号的字符串。有两种方法可以让不可重用的函数变成可重用的函数。第一种方法就是改变接口用指针或引用代替原先使用静态数据的地方。比方说POSIX定义了strok_rstd::strtok中的一个可重入的变量它用一个额外的char**参数来代替静态数据。这种方法很简单而且提供了可能的最佳效果。但是这样必须改变公共接口也就意味着必须改代码。另一种方法不用改变公有接口而是用本地存储线程thread local storage来代替静态数据有时也被成为特殊线程存储thread-specific storage。Boost线程库提供了智能指针boost::thread_specific_ptr来访问本地存储线程。每一个线程第一次使用这个智能指针的实例时它的初值是NULL所以必须要先检查这个它的只是否为空并且为它赋值。Boost线程库保证本地存储线程中保存的数据会在线程结束后被清除。List5是一个使用boost::thread_specific_ptr的简单例子。其中创建了两个线程来初始化本地存储线程并有10次循环每一次都会增加智能指针指向的值并将其输出到std::cout上由于std::cout是一个共享资源所以通过互斥体进行同步。main线程等待这两个线程结束后就退出。从这个例子输出可以明白的看出每个线程都处理属于自己的数据实例尽管它们都是使用同一个boost::thread_specific_ptr。 #include boost/thread/thread.hpp
#include boost/thread/mutex.hpp
#include boost/thread/tss.hpp
#include iostreamboost::mutex io_mutex;
boost::thread_specific_ptrint ptr;struct count
{count(int id) : id(id) { }void operator()(){if (ptr.get() 0)ptr.reset(new int(0));for (int i 0; i 10; i){(*ptr);boost::mutex::scoped_locklock(io_mutex);std::cout id : *ptr std::endl;}}int id;
};int main(int argc, char* argv[])
{boost::thread thrd1(count(1));boost::thread thrd2(count(2));thrd1.join();thrd2.join();return 0;
}