多线程和互斥量
来源:互联网 发布:google翻译软件下载 编辑:程序博客网 时间:2024/06/01 07:40
在单核处理器上,内核使用时间分片来模拟线程的并发执行;在多核处理器上,线程与进程一样,可以并发执行。
两种软件运行模式:单进程/多线程模式,非多进程/单线程模式。为什么使用线程不使用进程?进程间通信(IPC)困难。每个进程拥有独自的内存空间,而线程共享相同的内存空间。http://blog.csdn.net/zmxiangde_88/article/details/7998458
Liunx线程基本函数
#include <pthread.h>
1.线程创建:
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
参数说明:
thread:指向pthread_create类型的指针,用于引用新创建的线程。
attr:用于设置线程的属性,一般不需要特殊的属性,所以可以简单地设置为NULL。
*(*start_routine)(void *):传递新线程所要执行的函数地址。
arg:新线程所要执行的函数的参数。
调用如果成功,则返回值是0,如果失败则返回错误代码。
2.线程终止
void pthread_exit(void *retval);
参数说明:
retval:返回指针,指向线程向要返回的某个对象。
线程通过调用pthread_exit函数终止执行,并返回一个指向某对象的指针。注意:绝不能用它返回一个指向局部变量的指针,因为线程调用该函数后,这个局部变量就不存在了,这将引起严重的程序漏洞。
3.线程同步
int pthread_join(pthread_t th, void **thread_return);
参数说明:
th:将要等待的线程。
thread_return:线程的返回值。
互斥体(mutex,mutual exclusion的缩写)。一个互斥体一次只允许一个线程访问共享区。当一个线程想要访问共享区时,首先要做的就是锁住(lock)互斥体。如果其他的线程已经锁住了互斥体,那么就必须先等那个线程将互斥体解锁,这样就保证了同一时刻只有一个线程能访问共享区域。
Boost线程库支持两大类互斥体,包括简单互斥体(simple mutex)和递归互斥体(recursive mutex)。如果同一个线程对互斥体上了两次锁,就会发生死锁(deadlock),也就是说所有的等待解锁的线程将一直等下去。有了递归互斥体,单个线程就可以对互斥体多次上锁,当然也必须解锁同样次数来保证其他线程可以对这个互斥体上锁。
在这两大类互斥体中,对于线程如何上锁还有多个变种。一个线程可以有三种方法来对一个互斥体加锁:
- 一直等到没有其他线程对互斥体加锁。
- 如果有其他互斥体已经对互斥体加锁就立即返回。
- 一直等到没有其他线程互斥体加锁,直到超时。
boost::try_mutex,
boost::timed_mutex,
boost::recursive_mutex,
boost::recursive_try_mutex,
boost::recursive_timed_mutex
- boost::mutex::scoped_lock lock(mutex_);
- cond_.wait(lock);
#ifdef WIN32#define WIN32_LEAN_AND_MEAN#include <windows.h>class fast_mutex{private: CRITICAL_SECTION _M_mtx_impl;public: fast_mutex() { ::InitializeCriticalSection(&_M_mtx_impl); } ~fast_mutex() { ::DeleteCriticalSection(&_M_mtx_impl); } void lock() { ::EnterCriticalSection(&_M_mtx_impl); } bool trylock() { if (::TryEnterCriticalSection(&_M_mtx_impl)) { return true; }else{ return false; } } void unlock() { ::LeaveCriticalSection(&_M_mtx_impl); }private: // 禁止拷贝构造函数和赋值构造函数 fast_mutex(const fast_mutex&); fast_mutex& operator=(const fast_mutex&);};#else // for Linux#include <pthread.h>class fast_mutex{private: pthread_mutex_t _M_mtx_impl; pthread_mutexattr_t _M_mtx_attr;public: fast_mutex() { ::pthread_mutexattr_init(&_M_mtx_attr); ::pthread_mutexattr_settype(&_M_mtx_attr, PTHREAD_MUTEX_RECURSIVE); ::pthread_mutex_init(&_M_mtx_impl, &_M_mtx_attr); } ~fast_mutex() { ::pthread_mutex_destroy(&_M_mtx_impl); ::pthread_mutexattr_destroy(&_M_mtx_attr); } void lock() { ::pthread_mutex_lock(&_M_mtx_impl); } bool trylock() { if (::pthread_mutex_trylock(&_M_mtx_impl)) { return true; } else { return false; } } void unlock() { ::pthread_mutex_unlock(&_M_mtx_impl); }private: // 禁止拷贝构造函数和赋值构造函数 fast_mutex(const fast_mutex& ); fast_mutex& operator=(const fast_mutex&);};#endif // end for WIN32
- 多线程 -- 信号量和互斥量
- 多线程和互斥量
- 多线程:互斥量和条件量
- LINUX 多线程互斥量和读写锁区别
- LINUX多线程互斥量和读写锁区别
- LINUX多线程互斥量和读写锁区别
- LINUX多线程互斥量和读写锁区别
- 互斥量和信号量的区别【多线程概念】
- c++11 多线程 二 锁和互斥量
- [多线程] 互斥量和临界区的区别
- linux多线程之互斥量和条件变量
- WinAPI多线程和OpenMP多线程
- NSThread多线程和GCD多线程
- 协作多线程和抢占多线程
- java多线程和Python多线程
- DllMain和多线程死锁
- 多线程和线程安全
- 多任务和多线程
- 得到今天日期并得到前后几天的日期,或者输入指定格式任意日期得到前后几天的日期
- LLVM(Clang)的编译过程
- 大数据处理引擎Spark与Flink对比分析!
- JAVA Runtime.addShutdownHook()方法{拿到线程句柄,在程序关闭之前调用释放资源}
- 使用JUnit测试预期异常
- 多线程和互斥量
- PC-1500的代码存入WAV文件
- Intel MKL FATAL ERROR: Cannot load libmkl_avx.so or libmkl_def.so.
- 导出时添加模板导出Excel
- 文章标题
- Linux内核链表细节及应用实例
- hadoop学习笔记 一 安装搭建hello world
- C++中的Lambda表达式详解
- [绍棠] iOS UITableView 的坑:isDragging 属性无效, tableView是拖拽还是自由滑动区分