summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRbb666 <[email protected]>2025-09-01 22:47:28 +0800
committerR b b666 <[email protected]>2025-09-09 13:08:30 +0800
commite1c1a07c48200fd3a99b6edc05cc2d80cfa6ff18 (patch)
treed395be20a1e99108d425ffc49138ed09418050cc /src
parentafb3f229733df9ce44e3e003421c3bc8d8df379c (diff)
[add][thread]Add api:rt_thread_suspend_force allow suspend other threads.
Diffstat (limited to 'src')
-rw-r--r--src/thread.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/thread.c b/src/thread.c
index 7c3a7e0c65..2a3300bbed 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -947,14 +947,19 @@ rt_err_t rt_thread_suspend_to_list(rt_thread_t thread, rt_list_t *susp_list, int
/* parameter check */
RT_ASSERT(thread != RT_NULL);
RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
- RT_ASSERT(thread == rt_thread_self());
LOG_D("thread suspend: %s", thread->parent.name);
rt_sched_lock(&slvl);
stat = rt_sched_thread_get_stat(thread);
- if ((stat != RT_THREAD_READY) && (stat != RT_THREAD_RUNNING))
+ if (stat == RT_THREAD_SUSPEND)
+ {
+ rt_sched_unlock(slvl);
+ /* Already suspended, just set status to success. */
+ return RT_EOK;
+ }
+ else if ((stat != RT_THREAD_READY) && (stat != RT_THREAD_RUNNING))
{
LOG_D("thread suspend: thread disorder, 0x%2x", RT_SCHED_CTX(thread).stat);
rt_sched_unlock(slvl);
@@ -1042,7 +1047,30 @@ RTM_EXPORT(rt_thread_suspend_with_flag);
/**
* @brief This function will suspend the specified thread and change it to suspend state.
*
- * @param thread Handle of the thread to be suspended.
+ * @note This function can suspend both the current thread itself and other threads.
+ * Please use this API with extreme caution when suspending other threads.
+ *
+ * When suspending the current thread:
+ * rt_thread_suspend(rt_thread_self());
+ * This is generally safe as the thread voluntarily suspends itself.
+ *
+ * When suspending other threads:
+ * You have no way of knowing what code another thread is executing when you suspend it.
+ * If you suspend a thread while it is sharing a resource with other threads and occupying
+ * this resource (such as holding a mutex, semaphore, or other synchronization objects),
+ * deadlock or resource starvation can occur very easily.
+ *
+ * @warning Suspending other threads arbitrarily can lead to:
+ * - Deadlock situations
+ * - Resource starvation
+ * - System instability
+ * - Unpredictable behavior
+ *
+ * Only suspend other threads when you have full control over the system state
+ * and understand the implications.
+ *
+ * @param thread Handle of the thread to be suspended. Can be the current thread
+ * (rt_thread_self()) or any other thread.
*
* @return Return the operation status. If the return value is `RT_EOK`, the
* function is successfully executed.