嵌入式 linux下多线程同步问题

本文详细介绍了嵌入式Linux系统中多线程同步的三种方法:互斥锁、条件变量和信号量。通过示例代码演示了它们的使用,包括互斥锁的初始化、加锁、解锁和销毁,条件变量的等待与触发,以及信号量的增减和销毁操作。同时,强调了在使用这些同步机制时应注意的细节,如避免死锁、正确释放资源等。
摘要由CSDN通过智能技术生成
现在流行的进程线程同步互斥的控制机制,其实是由最原始最基本的4种方法实现的。由这4种方法组合优化就有了.Net和Java下灵活多变的,编程简便的线程进程控制手段。
1临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2互斥量:为协调共同对一个共享资源的单独访问而设计的。
3信号量:为控制一个具有有限数量用户资源而设计。
4事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。

1)互斥锁(mutex

    通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);

int pthread_mutex_lock(pthread_mutex *mutex);

int pthread_mutex_destroy(pthread_mutex *mutex);

int pthread_mutex_unlock(pthread_mutex *

(1)先初始化锁init()或静态赋值pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER

attr_t有:

PTHREAD_MUTEX_TIMED_NP:其余线程等待队列

PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁,允许线程多次加锁,不同线程,解锁后重新竞争

PTHREAD_MUTEX_ERRORCHECK_NP:检错,与一同,线程请求已用锁,返回EDEADLK;

PTHREAD_MUTEX_ADAPTIVE_NP:适应锁,解锁后重新竞争

(2)加锁,lock,trylock,lock阻塞等待锁,trylock立即返回EBUSY

(3)解锁,unlock需满足是加锁状态,且由加锁线程解锁

(4)清除锁,destroy(此时锁必需unlock,否则返回EBUSY,//Linux下互斥锁不占用内存资源

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <cstdio>
 
#include <cstdlib>
 
#include <unistd.h>
 
#include <pthread.h>
 
#include "iostream"
 
    
 
using namespace std;
 
    
 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 
int tmp;
 
    
 
void * thread( void *arg)
 
{
 
    cout << "thread id is " << pthread_self() << endl;
 
    pthread_mutex_lock(&mutex);
 
    tmp = 12 ;
 
    cout << "Now a is " << tmp << endl;
 
    pthread_mutex_unlock(&mutex);
 
    return NULL;
 
}
 
    
 
int main()
 
{
 
    pthread_t id;
 
    cout << "main thread id is " << pthread_self() << endl;
 
    tmp = 3 ;
 
    cout << "In main func tmp = " << tmp << endl;
 
    if (!pthread_create(&id, NULL, thread, NULL))
 
    {
 
        cout << "Create thread success!" << endl;
 
    }
 
    else
 
    {
 
        cout << "Create thread failed!" << endl;
 
    }
 
    pthread_join(id, NULL);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值