多线程、并发

目标:

系统总结一下。后续逐步补充高并发的设计知识。

线程同步

防止多个线程同时访问一个内存空间,造成冲突。

互斥量、临界区、事件、信号量、条件变量的定义、例子及区别

https://www.cnblogs.com/jzincnblogs/p/5188051.html

从中可见,互斥量例子

//main.cpp
#include 
#include 

DWORD WINAPI Fun_1(LPVOID p);
DWORD WINAPI Fun_2(LPVOID p);

HANDLE h_mutex;  
unsigned int counter = 0;

int main()
{
    h_mutex = CreateMutex(nullptr, false, nullptr); //创建互斥量
    HANDLE h1 = CreateThread(nullptr, 0, Fun_1, nullptr, 0, nullptr);
    std::cout << "Thread 1 started...\n";
    HANDLE h2 = CreateThread(nullptr, 0, Fun_2, nullptr, 0, nullptr);
    std::cout << "Thread 2 started...\n";
    CloseHandle(h1);
    CloseHandle(h2);
    //
    //CloseHandle(h_mutex);
    system("pause");
    return 0;
}

DWORD WINAPI Fun_1(LPVOID p)
{
    while (true)
    {
        WaitForSingleObject(h_mutex, INFINITE); //等待
        if (counter < 1000)
        {
            ++counter;
            std::cout << "Thread 1 counting " << counter << "...\n";
            ReleaseMutex(h_mutex); //每个线程运行完,释放互斥量
        }
        else
        {
            ReleaseMutex(h_mutex);
            break;
        }
    }
    return 0;
}

DWORD WINAPI Fun_2(LPVOID p)
{
    while (true)
    {
        WaitForSingleObject(h_mutex, INFINITE);
        if (counter < 1000)
        {
            ++counter;
            std::cout << "Thread 2 counting " << counter << "...\n";
            ReleaseMutex(h_mutex);
        }
        else
        {
            ReleaseMutex(h_mutex);
            break;
        }
    }
    return 0;
}

https://www.cnblogs.com/yuuyuu/p/5140875.html
https://www.cnblogs.com/cs-jin-note/archive/2012/10/30/2746468.html

从中可见条件变量的例子:
假设线程t0,t1,t2的操作是sum++,而线程t3则是在sum到达100的时候,打印出一条信息,并对sum清零。
你首先定义一个condition variable.
pthread_cond_t cond_sum_ready=PTHREAD_COND_INITIALIZER;
然后t0,t1,t2的代码只要后面加两行,像这样:

add() 
{ 
    pthread_mutex_lock(lock_s); 
    sum++; 
    pthread_mutex_unlock(lock_s); 
    if(sum>=100) 
      pthread_cond_signal(&cond_sum_ready); //通知函数,至少唤醒一个等待的线程
} 

T3线程

{ 
    pthread_mutex_lock(lock_s); 
    while(sum<100) 
        pthread_cond_wait(&cond_sum_ready, &lock_s); //等待
    printf(“sum is over 100!”); 
    sum=0; 
    pthread_mutex_unlock(lock_s); 
    return;
} 

区别:
个人理解,
互斥量、临界区、事件都是保证一段内存只能同时被一个线程访问
而信号量,是保证一段内存只能同时被多个线程访问(通过信号量控制多个线程的数目)。
互斥量、事件、信号量可以跨进程,而临界区只能用于一个进程内的多个线程。因此,如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量 。
条件变量是多线程间一个线程可以通过条件变量来告知其他线程某个状态发生了改变,让等待在这个条件变量的线程继续执行。

你可能感兴趣的:(多线程,并发,软件工程基础)