补充示例.

Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
chen.yang 2022-04-15 12:51:15 +08:00
parent d85646aede
commit e7a3e696f5

View File

@ -302,13 +302,13 @@ struct rw_semaphore my_rws;
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);
// 释放读信号量
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);
// 释放写信号量
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
// 码定义名为互斥体
@ -336,4 +336,50 @@ void fastcall mutex_unlock(struct mutex *lock);
## 并发控制示例
```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;
}
```