c++ 多线程同步代码
时间: 2023-10-28 20:42:55 浏览: 41
你可以使用锁来实现多线程同步,锁是一种机制,它可以保证在同一时刻只有一个线程可以执行关键区域的代码。例如,你可以使用互斥锁来保护共享资源,以避免多个线程同时访问导致数据错误或不一致的问题。在 C 语言中,通常使用 pthread 库来实现多线程的开发。你可以使用 pthread_mutex_init() 函数来初始化锁,pthread_mutex_lock() 函数来获取锁,pthread_mutex_unlock() 函数来释放锁。
相关问题
C++多线程同步参考代码
以下是一个使用互斥锁和条件变量实现多线程同步的示例代码:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void worker(int id)
{
std::unique_lock<std::mutex> lock(mtx);
while (!ready)
{
cv.wait(lock);
}
std::cout << "Worker " << id << " is working" << std::endl;
}
int main()
{
std::thread workers[5];
for (int i = 0; i < 5; ++i)
{
workers[i] = std::thread(worker, i + 1);
}
// 做一些准备工作...
{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
cv.notify_all();
}
for (int i = 0; i < 5; ++i)
{
workers[i].join();
}
return 0;
}
```
在上述代码中,我们创建了5个线程,每个线程都会等待条件变量`ready`为`true`时才开始执行工作。在主线程中,我们在做完准备工作后,通过互斥锁将`ready`设置为`true`,并通过条件变量的`notify_all`通知所有等待的线程开始工作。
注意,在等待条件变量时,我们使用了`cv.wait(lock)`来阻塞线程,并释放互斥锁。这样做可以避免线程占用过多的系统资源,直到条件满足才继续执行。
以上只是一个简单的示例,实际使用时,可能还需要考虑更复杂的同步问题,并根据具体情况选择合适的同步机制。
c++实现多线程ping代码
以下是用C++实现多线程Ping的示例代码:
```cpp
#include <iostream>
#include <thread>
#include <vector>
#include <chrono>
#include <mutex>
#include <condition_variable>
#include <atomic>
#include <string>
#ifdef _WIN32
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#else
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#endif
std::mutex mtx;
std::condition_variable cv;
std::atomic<int> activeThreads(0);
void pingHost(const std::string& ip) {
// 创建套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Failed to create socket for " << ip << std::endl;
return;
}
// 设置超时时间为1秒
struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
// 设置服务器地址和端口
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(80);
if (inet_pton(AF_INET, ip.c_str(), &(server.sin_addr)) <= 0) {
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Invalid address: " << ip << std::endl;
return;
}
// 连接到服务器
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Failed to connect to " << ip << std::endl;
return;
}
std::lock_guard<std::mutex> lock(mtx);
std::cout << "Ping successful to " << ip << std::endl;
#ifdef _WIN32
closesocket(sock);
#else
close(sock);
#endif
}
int main() {
#ifdef _WIN32
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "Failed to initialize Winsock" << std::endl;
return 1;
}
#endif
std::vector<std::string> hosts = { "127.0.0.1", "192.168.0.1", "8.8.8.8" };
std::vector<std::thread> threads;
for (const auto& host : hosts) {
threads.emplace_back([&]() {
pingHost(host);
activeThreads--;
cv.notify_one();
});
activeThreads++;
}
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [&]() { return activeThreads == 0; });
#ifdef _WIN32
WSACleanup();
#endif
return 0;
}
```
上述代码使用了C++的线程库std::thread来创建多个线程,每个线程执行pingHost函数来执行Ping操作。通过互斥锁std::mutex和条件变量std::condition_variable来实现线程同步和等待所有线程完成的功能。
注意:上述代码在Windows平台下使用了Winsock库进行套接字操作,而在其他平台下使用了标准的POSIX套接字操作。请根据实际平台进行适配或修改。