diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md
index 7607a48bf6..76852b6d46 100644
--- a/trunk/doc/CHANGELOG.md
+++ b/trunk/doc/CHANGELOG.md
@@ -7,6 +7,7 @@ The changelog for SRS.
## SRS 6.0 Changelog
+* v6.0, 2024-03-24, Merge [#3989](https://github.com/ossrs/srs/pull/3989): ST: Research adds examples that demos pthread and helloworld. v6.0.118 (#3989)
* v6.0, 2024-03-19, Merge [#3958](https://github.com/ossrs/srs/pull/3958): Add a TCP proxy for debugging. v6.0.117 (#3958)
* v6.0, 2024-03-20, Merge [#3964](https://github.com/ossrs/srs/pull/3964): WebRTC: Add support for A/V only WHEP/WHEP player. v6.0.116 (#3964)
* v6.0, 2024-03-19, Merge [#3990](https://github.com/ossrs/srs/pull/3990): System: Disable feature that obtains versions and check features status. v6.0.115 (#3990)
diff --git a/trunk/research/st/exceptions.cpp b/trunk/research/st/exceptions.cpp
new file mode 100644
index 0000000000..8dadcfc5d0
--- /dev/null
+++ b/trunk/research/st/exceptions.cpp
@@ -0,0 +1,29 @@
+/*
+# !!! ST does not support C++ exceptions on cygwin !!!
+g++ exceptions.cpp ../../objs/st/libst.a -g -O0 -o exceptions && ./exceptions
+*/
+#include
+#include
+#include "../../objs/st/st.h"
+
+int handle_exception() {
+ try {
+ throw 3;
+ } catch (...) {
+ return 5;
+ }
+}
+
+void* foo(void* arg) {
+ int r0 = handle_exception();
+ printf("r0=%d\n", r0);
+ return NULL;
+}
+
+int main(int argc, char** argv) {
+ st_init();
+ st_thread_create(foo, NULL, 0, 0);
+ st_thread_exit(NULL);
+ return 0;
+}
+
diff --git a/trunk/research/st/hello-st.cpp b/trunk/research/st/hello-st.cpp
new file mode 100644
index 0000000000..f0fba9a2be
--- /dev/null
+++ b/trunk/research/st/hello-st.cpp
@@ -0,0 +1,16 @@
+/*
+g++ hello-st.cpp ../../objs/st/libst.a -g -O0 -o hello-st && ./hello-st
+*/
+#include
+#include "../../objs/st/st.h"
+
+void foo() {
+ st_init();
+ st_sleep(1);
+ printf("Hello World, ST!\n");
+}
+
+int main() {
+ foo();
+ return 0;
+}
diff --git a/trunk/research/st/hello-world.cpp b/trunk/research/st/hello-world.cpp
new file mode 100644
index 0000000000..c49dba3278
--- /dev/null
+++ b/trunk/research/st/hello-world.cpp
@@ -0,0 +1,19 @@
+/*
+g++ hello-world.cpp ../../objs/st/libst.a -g -O0 -o hello-world && ./hello-world
+*/
+#include
+#include "../../objs/st/st.h"
+
+void foo() {
+ st_init();
+
+ for (int i = 0; ; i++) {
+ st_sleep(1);
+ printf("#%d: main: working\n", i);
+ }
+}
+
+int main() {
+ foo();
+ return 0;
+}
diff --git a/trunk/research/st/hello.cpp b/trunk/research/st/hello.cpp
new file mode 100644
index 0000000000..dd21ba7f03
--- /dev/null
+++ b/trunk/research/st/hello.cpp
@@ -0,0 +1,11 @@
+/*
+ g++ hello.cpp -g -O0 -o hello && ./hello
+ */
+
+void foo() {
+}
+
+int main(int argc, char** argv) {
+ foo();
+ return 0;
+}
diff --git a/trunk/research/st/pthreads.cpp b/trunk/research/st/pthreads.cpp
new file mode 100644
index 0000000000..e87c6034e1
--- /dev/null
+++ b/trunk/research/st/pthreads.cpp
@@ -0,0 +1,36 @@
+/*
+Directly compile c++ source and execute:
+ g++ pthreads.cpp ../../objs/st/libst.a -g -O0 -o pthreads && ./pthreads
+*/
+#include
+#include
+#include "../../objs/st/st.h"
+
+void* foo(void* arg) {
+ while (true) {
+ printf("Hello, child thread\n");
+ st_sleep(1);
+ }
+ return NULL;
+}
+
+void* pfn(void* arg) {
+ st_init();
+ st_thread_create(foo, NULL, 0, 0);
+ st_thread_exit(NULL);
+ return NULL;
+}
+
+int main(int argc, char** argv) {
+ st_init();
+
+ pthread_t trd;
+ pthread_create(&trd, NULL, pfn, NULL);
+
+ while (true) {
+ printf("Hello, main thread\n");
+ st_sleep(1);
+ }
+ return 0;
+}
+
diff --git a/trunk/src/core/srs_core_version6.hpp b/trunk/src/core/srs_core_version6.hpp
index d79d5849d4..36551a9e00 100644
--- a/trunk/src/core/srs_core_version6.hpp
+++ b/trunk/src/core/srs_core_version6.hpp
@@ -9,6 +9,6 @@
#define VERSION_MAJOR 6
#define VERSION_MINOR 0
-#define VERSION_REVISION 117
+#define VERSION_REVISION 118
#endif