互斥字符串编程题通常要求实现多个线程安全地访问和操作一个字符串。下面是一个使用C++和POSIX线程(pthread)实现互斥访问字符串的示例:
```cpp
include include include // 全局互斥锁 pthread_mutex_t mutex; // 共享字符串 std::string shared_string = "hello world"; // 读取字符串的线程函数 void* read_string(void* arg) { while (1) { // 锁定互斥锁 pthread_mutex_lock(&mutex); // 打印字符串 std::cout << "Read string: " << shared_string << std::endl; // 增加计数器 static int g_count = 0; g_count++; std::cout << "-start reverse---" << g_count << "---" << std::endl; // 解锁互斥锁 pthread_mutex_unlock(&mutex); // 休眠1秒 sleep(1); // 如果计数器达到5,退出循环 if (g_count == 5) break; } pthread_exit("read_ok"); } // 反转字符串的线程函数 void* reverse_string(void* arg) { int i; char* str = new char[shared_string.length() + 1]; for (i = 0; i < shared_string.length(); i++) { str[i] = shared_string[shared_string.length() - 1 - i]; } str[i] = '\0'; // 锁定互斥锁 pthread_mutex_lock(&mutex); // 替换共享字符串 shared_string = str; // 解锁互斥锁 pthread_mutex_unlock(&mutex); // 释放分配的内存 delete[] str; pthread_exit("reverse_ok"); } int main() { // 初始化互斥锁 pthread_mutex_init(&mutex, NULL); // 创建读取字符串的线程 pthread_t read_thread; pthread_create(&read_thread, NULL, read_string, NULL); // 创建反转字符串的线程 pthread_t reverse_thread; pthread_create(&reverse_thread, NULL, reverse_string, NULL); // 等待线程结束 pthread_join(read_thread, NULL); pthread_join(reverse_thread, NULL); // 销毁互斥锁 pthread_mutex_destroy(&mutex); return 0; } ``` 代码解释 定义一个全局的互斥锁`mutex`,用于保护共享资源`shared_string`。 定义一个全局的字符串`shared_string`,多个线程将访问和修改这个字符串。 `read_string`函数中,线程会不断读取并打印`shared_string`,然后增加一个计数器`g_count`。每次读取后,线程会释放互斥锁,休眠1秒,然后继续读取。 `reverse_string`函数中,线程会创建一个新的字符串,将`shared_string`的内容反转后赋值给`shared_string`,然后释放新字符串的内存。 初始化互斥锁,创建两个线程分别执行读取和反转字符串的操作,最后等待线程结束并销毁互斥锁。 建议 线程安全:确保所有对共享资源的访问都通过互斥锁进行保护,避免数据竞争。 资源管理:注意线程函数的返回值和异常处理,确保资源正确释放。 性能考虑:互斥锁可能导致性能瓶颈,如果性能要求较高,可以考虑使用更高效的同步机制,如读写锁或无锁数据结构。全局互斥锁:
共享字符串:
读取字符串的线程函数:
反转字符串的线程函数:
主函数: