C++多线程怎么实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++多线程怎么实现相关的知识,希望对你有一定的参考价值。

C++多线程也可以使用UNIX C的库函数,pthread_mutex_t,pthread_create,pthread_cond_t,pthread_detach,pthread_mutex_lock/unlock,等等。在使用多线程的时候,你需要先创建线程,使用pthread_create,你可以使主线程等待子线程使用pthread_join,也可以使线程分离,使用pthread_detach。线程使用中最大的问题就是同步问题,一般使用生产着消费者模型进行处理,使用条件变量pthread_cond_t,pthread_mutex,pthread_cond_wait来实现。别人说再多也是别人的,自己看书或者Google去吧。 参考技术A 1.如
john737所说,linux用pthread多线程没有比进程fork和exec方式有优势。
想知道头文件用MAN手册例如:
$:man
fork
2.线程和进程都是平台相关的,如果想要代码可移植用宏定义方式解决:
#ifdef
WIN32
#define
MyThreadBegin
afxBeginThread
#else
#define
MyThreadBegin
pthread_create
#endif
这种代码只是理论上的,因为参数其实都不一样。
不建议作任何尝试编写平台可移植的多线程代码。以你现在的水平没有任何意义。这类代码你可以参见一些开元库。一般的做法是编写独立模块,然后用配置文件在MAke的时候就去确定平台了,功能代码中一般调用自己的线程启动接口。
另外如果你想学习pthread我这里倒是有一份专门讲这个得文档,在我CSDN空间。
3.问题2,得答案
如_冬晨
所说。你问题概念中C++其实是MFC和C#。并不是C++语言
4.个人觉得你的问题没有必要用线程池的思想,做一个后台守护进程,然后循环看文件,每当有新文件出现就将该文件标记为已经处理,然后fork一个新的进程处理就好了。应该没啥难度的。不必要非用线程的,Linux内核中线程和进程的实现没什么太大区别。

c++ 多线程编程

  刚做完消息服务器的项目,项目是用c++开发的,没有引入现在c++的特性向智能指针,bind/function等。当时在开发的时候对其中一个bug印象比较深,bug原因是在session对象释放后,在其他地方继续的被使用。

    对于临界资源加锁处理。对于多个线程共享的对象通过使

  1. 有过多线程编程经验的都知道多线程编程最基本的就是通过加锁实现对临界资源的安全读写。

  实现局部锁

class MutexLock : boost::noncopyable
{
public:
        MutexLock() 
        {
            pthread_mutex_init(&mutex_, NULL);
        }
        
        ~MutexLock()
        {
            pthread_mutex_destroy(&mutex_);
        }
        
        void lock()
        {
            pthread_mutex_lock(&mutex_);
        }
        
        void unlock()
        {
            pthread_mutex_unlock(&mutex_);
        }
        
private:
        pthread_mutex_t mutex_;
};

class MutexLockGuard : boost::noncopyable
{
public:
    explicit MutexLockGuard(MutexLock& mutex) : mutex_(mutex)
    {
        mutex_.lock();
    }
    
    ~MutexLockGuard()
    {
        mutex_.unlock();
    }
    
private:
    MutexLock& mutex_;
}

 

  2. 对象构造的时候做到线程安全

    (1) 不要在构造函数内注册回调函数

    (2) 不要在构造函数中把this传给跨线程的对象

    (3) 即便在构造函数的最后一行也不行,因为如果这个类是基类,则初始化完基类后还要初始化派生类。

    因为在构造函数执行期间对象还没有初始化完成,在此时将this传给跨线程的对象,那个对象访问的将可能是一个没有初始化完全的半成品。

  3. 对象在析构时

    资源在A线程正在被使用,却在B线程被释放。就会造成A线程访问了无效的资源。解决这个问题的方法是在使用前判断资源是否有效。使用工具weak_ptr和shared_ptr

    shared_ptr本身不是线程安全的,多线程安全的使用shared_ptr需要加锁。

    shared_ptr会意外的延长对象的生命期

    对象在销毁的时候,对象内的锁是不会起作用的,这时候锁很有可能已经在使用前就被销毁了。

  

以上是关于C++多线程怎么实现的主要内容,如果未能解决你的问题,请参考以下文章

如果 ANSI C++ 不支持多线程,非托管 C++ 应用程序如何实现多线程?

C++在linux下怎么多线程

谁能简单说明下c++线程池怎么用的

c++ 多线程编程

C++多线程问题

急!!C++中如何同时运行两个函数??怎样通过代码来实现???? 如果是用多线程 ,那代码怎么写呢?