2010-08-18 31 views
5

Trình biên dịch Microsoft Visual C++ có các đối tượng EnterCriticalSectionExitCriticalSection để cho phép đồng bộ hóa giữa các chuỗi.Gcc trên Linux tương đương với các phần quan trọng của microsoft là gì?

Tương đương GCC là gì?

tôi thấy tài liệu tham khảo xung quanh để __sync_synchronize cùng với __scoped_lock

Trong thực tế, tôi thấy đề cập đến một số nguyên tử __sync chức năng cùng với một số __atomic người.

Tôi thực sự đã sử dụng __sync_fetch_and_add để tăng số nguyên tử Tôi có nên sử dụng __atomic_add_dispatch thay thế không?
Sự khác biệt là gì?

Tôi nên sử dụng loại nào? Có một số cấu trúc trong C + + mà tôi có thể sử dụng trong cả hai phiên bản mới nhất của GCC và Visual C++ 2010 có sẵn như tôi sẽ được viết một số mã nền tảng chéo.

Tôi thấy tăng cường có một số chức năng có sẵn, nhưng vì nhiều lý do tôi không được phép sử dụng tăng dưới cửa sổ.

+0

Tôi cho rằng bạn không thể sử dụng bất kỳ thư viện khác hoặc là sau đó? Qt có API luồng tốt (đa nền tảng). – Job

Trả lời

13

Trên Linux (và UNIXen khác), bạn cần sử dụng PThread hoặc Chủ đề Posix. Không có tương đương với các phần quan trọng trên Windows; sử dụng Mutex thay thế.

EDIT: Xem bình luận đầu tiên bên dưới - dường như Posix Mutexes giống với Win32 Critical Section trong đó chúng bị ràng buộc vào một quá trình đơn lẻ.

+3

Thực ra, các mutex của POSIX tương đương với các phần quan trọng của Win32 (quá trình bao bọc); Win32 Mutexes khác với các phần quan trọng trong quá trình xử lý chéo. – MSalters

+0

@MSalters: Ah - không biết điều đó. Phải smash thuật ngữ tái sử dụng. –

+0

@MSalters, Ngoài ra, Win32 Critical Section là nhanh hơn rất nhiều so với Win32 mutexes vì ​​chúng được thực hiện trong không gian người dùng và không liên quan đến phí trên kết hợp với cuộc gọi hệ thống. Tôi không biết về Posix mutexes mặc dù? – Tanuj

2

EnterCriticalSection và phần còn lại của API là API Win32. Theo như API đồng bộ đa nền tảng, tôi không nghĩ có bất kỳ (kể từ khi bạn đề cập đến bạn không thể sử dụng tăng). Ngoài ra, bạn đã đề cập đến nhiều nền tảng, điều này có nghĩa là các kiến ​​trúc khác nhau quá không (đối với phần gcc, tức là). Tôi đã thấy một triển khai lớn trong đó có một bộ API phổ biến được cung cấp đã được điều kiện để có API gốc (như fetch_and_add trên AIX) hoặc các API Win32 được sử dụng. Tôi từng cố gắng sử dụng posix threads on win32 nhưng gặp phải một loạt vấn đề (nhưng đó là một phiên bản rất cũ). Bây giờ YMMV.

6

Kiểm tra ở đây: http://en.wikipedia.org/wiki/Critical_section

/* Sample C/C++, Unix/Linux */ 
#include <pthread.h> 

/* This is the critical section object (statically allocated). */ 
static pthread_mutex_t cs_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; 

void f() 
{ 
    /* Enter the critical section -- other threads are locked out */ 
    pthread_mutex_lock(&cs_mutex); 

    /* Do some thread-safe processing! */ 

    /*Leave the critical section -- other threads can now pthread_mutex_lock() */ 
    pthread_mutex_unlock(&cs_mutex); 
} 

int main() 
{ 
    f(); 

    return 0; 
} 
1

Nếu bạn đang phát triển các chương trình chỉ dành cho nền tảng Windows, tôi nghĩ cách tốt nhất là sử dụng Win32 API. Nếu không, bạn có thể sử dụng các thư viện Qt C++ (cho mục đích đó Qt Core là đủ).

Xem thêm: QMutexQMutexLocker Bạn cũng có thể sử dụng: QReadWriteLock

Các vấn đề liên quan