POSIX 风格的互斥服务。
POSIX 风格的互斥服务。
互斥锁是一个 MUTual EXclusion 对象,用于保护共享数据结构免受并发修改,并实现临界区和监视器。
互斥锁有两种可能的状态:未锁定(未被任何任务拥有)和已锁定(被一个任务拥有)。互斥锁永远不能同时被两个不同的任务拥有。尝试锁定已被其他任务锁定的互斥锁的任务将被阻塞,直到后者先解锁互斥锁。
xkernel 互斥服务强制执行优先级继承协议以解决优先级反转问题。
int rt_mutex_acquire (RT_MUTEX *mutex, RTIME timeout);
获取/锁定互斥锁(具有相对标量超时)。
此例程是 rt_mutex_acquire_timed() 的一个变体,接受以标量值表示的相对超时规范。
参数
标签
xthread-only, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
int task_id = (int)(long)arg;
int ret;
printf("Task %d: Try to acquire mutex...\n", task_id);
ret = rt_mutex_acquire(&mutex, TM_INFINITE);
if (ret) {
fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
return;
}
printf("Task %d: Successfully acquired the mutex\n", task_id);
// 访问共享资源
shared_resource++;
printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
// 模拟工作
rt_task_sleep(1000000000); // 睡眠1秒
printf("Task %d: Release the mutex\n", task_id);
ret = rt_mutex_release(&mutex);
if (ret) {
fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
}
}
int main(int argc, char *argv[])
{
RT_TASK task1, task2;
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "MyMutex");
if (ret) {
fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务1
ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建任务2
ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task1, &task_function, (void *)1);
rt_task_start(&task2, &task_function, (void *)2);
// 等待任务完成
rt_task_join(&task1);
rt_task_join(&task2);
// 清理
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
rt_task_delete(&task2);
printf("Final shared resource value: %d\n", shared_resource);
return EXIT_SUCCESS;
}
int rt_mutex_acquire_timed (RT_MUTEX *mutex, const struct timespec *abs_timeout);
获取/锁定互斥锁(具有绝对超时日期)。
尝试锁定互斥锁。调用任务被阻止,直到互斥锁可用,在这种情况下,它会在该服务返回之前再次被锁定。xkernel 互斥锁是隐式递归的,并实现优先级继承协议。
参数
返回值
成功时返回零。否则:
标签
xthread-only, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
int task_id = (int)(long)arg;
int ret;
printf("Task %d: Try to acquire mutex...\n", task_id);
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
ts.tv_sec += 2; // 2 seconds
ret = rt_mutex_acquire_timed(&mutex, &ts);
if (ret) {
fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
return;
}
printf("Task %d: Successfully acquired the mutex\n", task_id);
// 访问共享资源
shared_resource++;
printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
// 模拟工作
rt_task_sleep(1000000000); // 睡眠1秒
printf("Task %d: Release the mutex\n", task_id);
ret = rt_mutex_release(&mutex);
if (ret) {
fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
}
}
int main(int argc, char *argv[])
{
RT_TASK task1, task2;
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "MyMutex");
if (ret) {
fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务1
ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建任务2
ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task1, &task_function, (void *)1);
rt_task_start(&task2, &task_function, (void *)2);
// 等待任务完成
rt_task_join(&task1);
rt_task_join(&task2);
// 清理
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
rt_task_delete(&task2);
printf("Final shared resource value: %d\n", shared_resource);
return EXIT_SUCCESS;
}
int rt_mutex_acquire_until (RT_MUTEX *mutex, RTIME timeout);
获取/锁定互斥锁(具有绝对标量超时)。
此例程是 rt_mutex_acquire_timed() 的变体,接受以标量值表示的绝对超时规范。
参数
标签
xthread-only, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
int task_id = (int)(long)arg;
int ret;
printf("Task %d: Try to acquire mutex...\n", task_id);
RTIME timeout = rt_timer_read() + 2000000000; // 2 seconds
ret = rt_mutex_acquire_until(&mutex, timeout);
if (ret) {
fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
return;
}
printf("Task %d: Successfully acquired the mutex\n", task_id);
// 访问共享资源
shared_resource++;
printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
// 模拟工作
rt_task_sleep(1000000000); // 睡眠1秒
printf("Task %d: Release the mutex\n", task_id);
ret = rt_mutex_release(&mutex);
if (ret) {
fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
}
}
int main(int argc, char *argv[])
{
RT_TASK task1, task2;
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "MyMutex");
if (ret) {
fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务1
ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建任务2
ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task1, &task_function, (void *)1);
rt_task_start(&task2, &task_function, (void *)2);
// 等待任务完成
rt_task_join(&task1);
rt_task_join(&task2);
// 清理
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
rt_task_delete(&task2);
printf("Final shared resource value: %d\n", shared_resource);
return EXIT_SUCCESS;
}
int rt_mutex_bind (RT_MUTEX *mutex, const char *name, RTIME timeout);
绑定到一个互斥锁。
此例程创建一个新的描述符来引用由其符号名称标识的现有互斥锁。如果在入口处对象不存在,调用者可能会阻塞,直到创建了给定名称的互斥锁。
参数
返回值
成功时返回零。否则:
标签
xthread-nowait, switch-primary
注意
超时值被解释为 Alchemy 时钟分辨率的倍数(参见 -alchemy-clock-resolution 选项,默认为 1 纳秒)。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
int task_id = (int)(long)arg;
int ret;
RT_MUTEX mutex_task;
ret = rt_mutex_bind(&mutex_task, "MyMutex", TM_INFINITE);
if (ret) {
fprintf(stderr, "Task: rt_mutex_bind %s\n", strerror(-ret));
return;
}
printf("Task %d: Try to acquire mutex...\n", task_id);
ret = rt_mutex_acquire(&mutex_task, TM_INFINITE);
if (ret) {
fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
return;
}
printf("Task %d: Successfully acquired the mutex\n", task_id);
// 访问共享资源
shared_resource++;
printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
// 模拟工作
rt_task_sleep(1000000000); // 睡眠1秒
printf("Task %d: Release the mutex\n", task_id);
ret = rt_mutex_release(&mutex_task);
if (ret) {
fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
}
rt_mutex_unbind(&mutex_task);
}
int main(int argc, char *argv[])
{
RT_TASK task1, task2;
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "MyMutex");
if (ret) {
fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务1
ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建任务2
ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task1, &task_function, (void *)1);
rt_task_start(&task2, &task_function, (void *)2);
// 等待任务完成
rt_task_join(&task1);
rt_task_join(&task2);
// 清理
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
rt_task_delete(&task2);
printf("Final shared resource value: %d\n", shared_resource);
return EXIT_SUCCESS;
}
int rt_mutex_create (RT_MUTEX *mutex, const char *name);
创建一个互斥锁。
创建一个互斥对象,允许多个任务同步访问共享资源。互斥锁在创建后处于未锁定状态。
参数
返回值
成功时返回零。否则:
标签
xthread-only, mode-unrestricted, switch-secondary
注意
属于同一 xkernel 会话的多个进程可以共享互斥锁。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
int task_id = (int)(long)arg;
int ret;
printf("Task %d: Try to acquire mutex...\n", task_id);
ret = rt_mutex_acquire(&mutex, TM_INFINITE);
if (ret) {
fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
return;
}
printf("Task %d: Successfully acquired the mutex\n", task_id);
// 访问共享资源
shared_resource++;
printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
// 模拟工作
rt_task_sleep(1000000000); // 睡眠1秒
printf("Task %d: Release the mutex\n", task_id);
ret = rt_mutex_release(&mutex);
if (ret) {
fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
}
}
int main(int argc, char *argv[])
{
RT_TASK task1, task2;
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "MyMutex");
if (ret) {
fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务1
ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建任务2
ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task1, &task_function, (void *)1);
rt_task_start(&task2, &task_function, (void *)2);
// 等待任务完成
rt_task_join(&task1);
rt_task_join(&task2);
// 清理
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
rt_task_delete(&task2);
printf("Final shared resource value: %d\n", shared_resource);
return EXIT_SUCCESS;
}
int rt_mutex_delete (RT_MUTEX *mutex);
删除一个互斥锁。
此例程删除由 rt_mutex_create() 调用先前创建的互斥对象。
参数
返回值
成功时返回零。否则:
标签
mode-unrestricted, switch-secondary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
int task_id = (int)(long)arg;
int ret;
printf("Task %d: Try to acquire mutex...\n", task_id);
ret = rt_mutex_acquire(&mutex, TM_INFINITE);
if (ret) {
fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
return;
}
printf("Task %d: Successfully acquired the mutex\n", task_id);
// 访问共享资源
shared_resource++;
printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
// 模拟工作
rt_task_sleep(1000000000); // 睡眠1秒
printf("Task %d: Release the mutex\n", task_id);
ret = rt_mutex_release(&mutex);
if (ret) {
fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
}
}
int main(int argc, char *argv[])
{
RT_TASK task1, task2;
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "MyMutex");
if (ret) {
fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务1
ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建任务2
ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task1, &task_function, (void *)1);
rt_task_start(&task2, &task_function, (void *)2);
// 等待任务完成
rt_task_join(&task1);
rt_task_join(&task2);
// 清理
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
rt_task_delete(&task2);
printf("Final shared resource value: %d\n", shared_resource);
return EXIT_SUCCESS;
}
int rt_mutex_inquire (RT_MUTEX *mutex, RT_MUTEX_INFO *info);
查询互斥锁状态。
此例程返回指定互斥锁的状态信息。
参数
返回值
成功时返回零,并将状态信息写入 info 指向的结构体。否则:
标签
xthread-only, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
int task_id = (int)(long)arg;
int ret;
RT_MUTEX_INFO info;
printf("Task %d: Try to acquire mutex...\n", task_id);
ret = rt_mutex_inquire(&mutex, &info);
if (ret) {
fprintf(stderr, "Task: rt_mutex_inquire %s\n", strerror(-ret));
return;
}
printf("Task %d: Get mutex info\n",task_id);
printf("Task %d: Name :%s, Owner:%p\n",task_id,info.name,info.owner);
ret = rt_mutex_acquire(&mutex, TM_INFINITE);
if (ret) {
fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
return;
}
printf("Task %d: Successfully acquired the mutex\n", task_id);
// 访问共享资源
shared_resource++;
printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
// 模拟工作
rt_task_sleep(1000000000); // 睡眠1秒
printf("Task %d: Release the mutex\n", task_id);
ret = rt_mutex_release(&mutex);
if (ret) {
fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
}
}
int main(int argc, char *argv[])
{
RT_TASK task1, task2;
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "MyMutex");
if (ret) {
fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务1
ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建任务2
ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task1, &task_function, (void *)1);
rt_task_start(&task2, &task_function, (void *)2);
// 等待任务完成
rt_task_join(&task1);
rt_task_join(&task2);
// 清理
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
rt_task_delete(&task2);
printf("Final shared resource value: %d\n", shared_resource);
return EXIT_SUCCESS;
}
int rt_mutex_release (RT_MUTEX *mutex);
释放/解锁互斥锁。
此例程释放先前通过调用 rt_mutex_acquire() 或 rt_mutex_acquire_until() 锁定的互斥锁对象。如果互斥锁处于挂起状态,则按优先级顺序立即解除第一个等待任务的阻塞,并将互斥锁的所有权转移给该任务;否则,互斥锁将处于未锁定状态。
参数
返回值
成功时返回零。否则:
标签
xthread-only, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
int task_id = (int)(long)arg;
int ret;
printf("Task %d: Try to acquire mutex...\n", task_id);
ret = rt_mutex_acquire(&mutex, TM_INFINITE);
if (ret) {
fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
return;
}
printf("Task %d: Successfully acquired the mutex\n", task_id);
// 访问共享资源
shared_resource++;
printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
// 模拟工作
rt_task_sleep(1000000000); // 睡眠1秒
printf("Task %d: Release the mutex\n", task_id);
ret = rt_mutex_release(&mutex);
if (ret) {
fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
}
}
int main(int argc, char *argv[])
{
RT_TASK task1, task2;
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "MyMutex");
if (ret) {
fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务1
ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建任务2
ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task1, &task_function, (void *)1);
rt_task_start(&task2, &task_function, (void *)2);
// 等待任务完成
rt_task_join(&task1);
rt_task_join(&task2);
// 清理
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
rt_task_delete(&task2);
printf("Final shared resource value: %d\n", shared_resource);
return EXIT_SUCCESS;
}
int rt_mutex_unbind (RT_MUTEX *mutex);
解除互斥锁绑定。
参数
此例程释放先前对互斥锁的绑定。此调用返回后,描述符不再有效,无法用于引用该对象。
标签
mode-unrestricted, switch-secondary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
int task_id = (int)(long)arg;
int ret;
RT_MUTEX mutex_task;
ret = rt_mutex_bind(&mutex_task, "MyMutex", TM_INFINITE);
if (ret) {
fprintf(stderr, "Task: rt_mutex_bind %s\n", strerror(-ret));
return;
}
printf("Task %d: Try to acquire mutex...\n", task_id);
ret = rt_mutex_acquire(&mutex_task, TM_INFINITE);
if (ret) {
fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
return;
}
printf("Task %d: Successfully acquired the mutex\n", task_id);
// 访问共享资源
shared_resource++;
printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
// 模拟工作
rt_task_sleep(1000000000); // 睡眠1秒
printf("Task %d: Release the mutex\n", task_id);
ret = rt_mutex_release(&mutex_task);
if (ret) {
fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
}
rt_mutex_unbind(&mutex_task);
}
int main(int argc, char *argv[])
{
RT_TASK task1, task2;
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "MyMutex");
if (ret) {
fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建任务1
ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建任务2
ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
if (ret) {
fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&task1, &task_function, (void *)1);
rt_task_start(&task2, &task_function, (void *)2);
// 等待任务完成
rt_task_join(&task1);
rt_task_join(&task2);
// 清理
rt_mutex_delete(&mutex);
rt_task_delete(&task1);
rt_task_delete(&task2);
printf("Final shared resource value: %d\n", shared_resource);
return EXIT_SUCCESS;
}