假設下面的代碼演示了一個二進制信號量示例。
在此示例中,我們有一個讀取 source.txt 并嘗試將內容復制到 destination.txt 的 pthread,同時使用二進制信號量將其鎖定。
如果沒有信號量,下面的評論部分會發生什么?
#include <cstdlib>
#include <memory>
#include <filesystem>
#define _TIMESPEC_DEFINED
#include <pthread.h>
#include <semaphore.h>
#include <thread>
#include <valarray>
pthread_t StartFileAccessThread();
void *CopyFile(void *parameters);
int main(int argc, char* argv[])
{
pthread_t thread = StartFileAccessThread();
void *returnValue;
pthread_join(thread, &returnValue);
getchar();
return EXIT_SUCCESS;
}
pthread_t StartFileAccessThread()
{
std::string sourcePath("source.txt");
std::string destinationPath("dest.txt");
sem_t semaphore;
sem_init(&semaphore, 0, 0);
pthread_t thread;
void *parameters[3];
parameters[0] = &semaphore;
parameters[1] = &sourcePath;
parameters[2] = &destinationPath;
pthread_create(&thread, nullptr, &CopyFile, parameters);
// What happens without the binary semaphore?
sem_wait(&semaphore);
sem_destroy(&semaphore);
printf("Freeing ressources.\n");
return thread;
}
void *CopyFile(void *rawParameter)
{
void **parameters = static_cast<void **>(rawParameter);
sem_t *semaphore = static_cast<sem_t *>(parameters[0]);
std::string sourcePath(*static_cast<std::string *>(parameters[1]));
std::string destinationPath(*static_cast<std::string *>(parameters[2]));
sem_post(semaphore);
std::this_thread::sleep_for(std::chrono::seconds(2));
copy_file(sourcePath, destinationPath, std::experimental::filesystem::copy_options::overwrite_existing);
printf("File copied \n");
return nullptr;
}
uj5u.com熱心網友回復:
如果沒有信號量,下面的評論部分會發生什么?
如果沒有信號量,函式startFileAccessThread()
可能會在新執行緒完成(或開始)從引數物件復制其引數之前回傳。該物件是本地的startFileAccessThread()
,因此它的生命周期在該函式回傳時結束。如果復制執行緒對它的訪問在此之前沒有發生,則會導致未定義的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/461342.html