补充示例.
Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
parent
d85646aede
commit
e7a3e696f5
@ -302,13 +302,13 @@ struct rw_semaphore my_rws;
|
|||||||
void init_rwsem(struct rw_semaphore *sem);
|
void init_rwsem(struct rw_semaphore *sem);
|
||||||
|
|
||||||
// 获取读信号量
|
// 获取读信号量
|
||||||
void down_read(struct rw_semaphore *sem);
|
void down_read(struct rw_semaphore *sem);
|
||||||
int down_read_trylock(struct rw_semaphore *sem);
|
int down_read_trylock(struct rw_semaphore *sem);
|
||||||
// 释放读信号量
|
// 释放读信号量
|
||||||
void up_read(struct rw_semaphore *sem);
|
void up_read(struct rw_semaphore *sem);
|
||||||
|
|
||||||
// 获取写信号量
|
// 获取写信号量
|
||||||
void down_write(struct rw_semaphore *sem);
|
void down_write(struct rw_semaphore *sem);
|
||||||
int down_write_trylock(struct rw_semaphore *sem);
|
int down_write_trylock(struct rw_semaphore *sem);
|
||||||
// 释放写信号量
|
// 释放写信号量
|
||||||
void up_write(struct rw_semaphore *sem);
|
void up_write(struct rw_semaphore *sem);
|
||||||
@ -316,7 +316,7 @@ void up_write(struct rw_semaphore *sem);
|
|||||||
|
|
||||||
## 互斥体
|
## 互斥体
|
||||||
|
|
||||||
尽管信号量已经可以实现互斥的功能,而且包含 DECLARE_MUTEX()、init_MUTEX ()等定义信号量的宏或函数,从名字上看就体现出了互斥体的概念,但是 mutex 在 Linux 内核中还是真实地存在的。
|
尽管信号量已经可以实现互斥的功能,而且包含 DECLARE_MUTEX()、init_MUTEX() 等定义信号量的宏或函数,从名字上看就体现出了互斥体的概念,但是 mutex 在 Linux 内核中还是真实地存在的。
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
// 码定义名为互斥体
|
// 码定义名为互斥体
|
||||||
@ -336,4 +336,50 @@ void fastcall mutex_unlock(struct mutex *lock);
|
|||||||
## 并发控制示例
|
## 并发控制示例
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
|
static ssize_t demo_read(struct file *filp, char __user *buffer, size_t count, loff_t *position)
|
||||||
|
{
|
||||||
|
struct demo_dev *devp = filp->private_data;
|
||||||
|
loff_t p = *position;
|
||||||
|
ssize_t ret = 0;
|
||||||
|
|
||||||
|
// This is a test.
|
||||||
|
// 分析和获取有效的读长度
|
||||||
|
if(DEMO_DATA_SIZE<=p) // 要读的偏移位置越界
|
||||||
|
return 0; // End of a file
|
||||||
|
if(DEMO_DATA_SIZE<(count+p)) // 要读的字节数太大
|
||||||
|
count = DEMO_DATA_SIZE-p;
|
||||||
|
|
||||||
|
if(copy_to_user((void*)buffer, &devp->demo_text[p], count))
|
||||||
|
ret = -EFAULT;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*position += count;
|
||||||
|
ret = count;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t demo_write(struct file *filp, const char __user *buffer, size_t count, loff_t *position)
|
||||||
|
{
|
||||||
|
struct demo_dev *devp = filp->private_data;
|
||||||
|
const char __user *p = buffer;
|
||||||
|
|
||||||
|
// This is a test.
|
||||||
|
// 分析和获取有效的写长度
|
||||||
|
if(DEMO_DATA_SIZE<=p) // 要读的偏移位置越界
|
||||||
|
return 0; // End of a file
|
||||||
|
if(DEMO_DATA_SIZE<(count+p)) // 要读的字节数太大
|
||||||
|
count = DEMO_DATA_SIZE-p;
|
||||||
|
|
||||||
|
if(copy_from_user(&devp->demo_text[p], (void*)buffer, count))
|
||||||
|
ret = -EFAULT;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*position += count;
|
||||||
|
ret = count;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)devp;
|
||||||
|
return p-buffer;
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
Loading…
x
Reference in New Issue
Block a user